ADB / Shell命令来管理通知通道?

时间:2019-06-28 05:11:31

标签: android adb android-notifications

Android 8.0及更高版本带来了通知渠道。是否可以通过ADB列出应用程序的所有通知渠道,创建渠道和/或禁用渠道?根解决方案也是可以接受的。 谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用服务调用超级用户命令创建通知频道,删除频道。

这是一个小示例,您可以通过它为任何应用启用或禁用通知。通过使用该引用,您可以获得通知渠道信息。

public final Shell.Interactive su = new Shell.Builder().useSU().open();
function setNotification(String packageName, int uid, boolean enable){
    try {
          @SuppressLint("PrivateApi") Field field = Class.forName("android.app.INotificationManager").getDeclaredClasses()[0].getDeclaredField("TRANSACTION_setNotificationsEnabledForPackage");
          field.setAccessible(true);
          int id = field.getInt(null);
          su.addCommand(String.format(Locale.ENGLISH, "service call notification %d s16 %s i32 %d i32 %d", id, packageName, uid, enable ? 1 : 0));
   } catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException e) {
          e.printStackTrace();
   }
}

这里service call用于调用底层服务,id用于标识函数,s16用于String输入,i32用于int< /strong> 输入它们只是我们在通知服务中调用的函数的参数。

您可以从这里找到服务电话的说明:

<块引用>

Where to find info on Android's "service call" shell command?

您可以从这里找到对 INotificationManager 的引用:

<块引用>

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/INotificationManager.aidl

如您所见,我在示例中使用的 INotificationManager 中有一个名为 setNotificationsEnabledForPackage 的函数。 getNotificationChannel之类的通知通道有很多相关的函数,只用适合自己的,用setNotificationsEnabledForPackage代替,并传递适当的参数。

这里 su 来自这个库:

<块引用>

https://github.com/Chainfire/libsuperuser

答案 1 :(得分:-1)

您可以尝试

adb shell dumpsys notification

这将显示有关NotificationManagerService的详细信息。

如果此答案对您有帮助,请接受我的答案。谢谢 。