Android 5 ADB通知转储错误数据

Android 5 ADB notification dump wrong data

我构建了一个可以在你的桌面上运行的电脑程序,它会通知你有关通知、电量级别的信息,并让你与你的智能手机互动phone。 整个 ADB - 因此不需要 phone 上的应用程序。 所有这一切都以时尚的方式进行。

但足够了,直到 android 5 出现。

通知转储(adb shell dumpsys 通知)显示与 sdk <= 19 中不同的输出

例如:

extras 区域显示了有关通知的详细信息。

      extras={
        android.title=String
        android.subText=null
        android.template=String
        android.showChronometer=Boolean (false)
        android.icon=Integer (2130837507)
        android.text=String
        android.progress=Integer (0)
        android.progressMax=Integer (0)
        android.showWhen=Boolean (true)
        android.rebuild.applicationInfo=ApplicationInfo (ApplicationInfo{14a2c165 com.nero.android.htc.sync})
        android.rebuild.contentView=Boolean (true)
        android.bigText=String
        android.infoText=null
        android.originatingUserId=Integer (0)
        android.progressIndeterminate=Boolean (false)
        android.rebuild=Boolean (true)
        android.rebuild.bigView=Boolean (true)
      }

这是 android 5 通知转储的示例。 你看,字符串只有数据类型,没有实际值。

有人知道我怎样才能得到实际值吗?像我缺少的一些参数?

或者您知道从 phone 向电脑发送通知的更好方法吗?

嗯,我遇到了同样的问题,似乎没有解决办法。

我查看了源代码并将其与一切正常时的版本进行了比较。 在 4.4.4 版本中它仍然有效。版本 5.0.0 中出现了更改,代码未更改为版本 5.1.1(我写这篇文章时我们拥有的最后一个源代码版本 post)。

所以,让我们看看负责打印额外通知部分的源代码。

如您所见,在 Android 4.4.4 中一切正常,代码打印值的字符串表示形式。 在 Android 5.0.0 - 5.1.1 中它只打印一种类型的值,而不是值本身。

Android 4.4.4.

if (notification.extras != null && notification.extras.size() > 0) {
    pw.println(prefix + "  extras={");
    for (String key : notification.extras.keySet()) {
        pw.print(prefix + "    " + key + "="); // <====== print key name
        Object val = notification.extras.get(key);
        if (val == null) {
            pw.println("null");
        } else {
            pw.print(val.toString()); // <====== print value here
            if (val instanceof Bitmap) {
                pw.print(String.format(" (%dx%d)",
                        ((Bitmap) val).getWidth(),
                        ((Bitmap) val).getHeight()));
            } else if (val.getClass().isArray()) {
                pw.println(" {");
                final int N = Array.getLength(val);
                for (int i=0; i<N; i++) {
                    if (i > 0) pw.println(",");
                    pw.print(prefix + "      " + Array.get(val, i));
                }
                pw.print("\n" + prefix + "    }");
            }
            pw.println();
        }
    }
    pw.println(prefix + "  }");
}

Android 5.0.0 - 5.1.1.

if (notification.extras != null && notification.extras.size() > 0) {
    pw.println(prefix + "  extras={");
    for (String key : notification.extras.keySet()) {
        pw.print(prefix + "    " + key + "="); // <====== print key name
        Object val = notification.extras.get(key);
        if (val == null) {
            pw.println("null");
        } else {
            pw.print(val.getClass().getSimpleName()); // <===== print a type, not a value itself
            if (val instanceof CharSequence || val instanceof String) {
                // redact contents from bugreports
            } else if (val instanceof Bitmap) {
                pw.print(String.format(" (%dx%d)",
                        ((Bitmap) val).getWidth(),
                        ((Bitmap) val).getHeight()));
            } else if (val.getClass().isArray()) {
                final int N = Array.getLength(val);
                pw.println(" (" + N + ")");
            } else {
                pw.print(" (" + String.valueOf(val) + ")");
            }
            pw.println();
        }
    }
    pw.println(prefix + "  }");
}

在 Android >= 6 上使用此命令获取额外通知的全文:

adb shell dumpsys notification --noredact

它将打印类型和值


      extras={
          android.title=String (Bring The Rain)
          android.reduced.images=Boolean (true)
          android.subText=null
          android.template=String (android.app.Notification$MediaStyle)
          toSingleLine=Boolean (false)
          android.text=String (Upon A Burning Body)
          android.appInfo=ApplicationInfo (ApplicationInfo{c8165e6 org.telegram.messenger})
          android.showWhen=Boolean (false)
          android.largeIcon=Icon (Icon(typ=BITMAP size=100x100))
          android.mediaSession=Token (android.media.session.MediaSession$Token@608a746)
          gameDndOn=Boolean (false)
          android.compactActions=int[] (3)
            [0] 0
            [1] 1
            [2] 2
      }