【问题标题】:ADB/Shell command to manage notification channels?ADB/Shell 命令来管理通知渠道?
【发布时间】:2019-11-10 01:49:54
【问题描述】:

Android 8.0 及以上版本带来了通知渠道。有没有办法列出所有通知渠道,为亚行的应用程序创建渠道和/或禁用渠道?根解决方案也是可以接受的。 谢谢。

【问题讨论】:

  • 我试图找到相同的。你有解决办法吗?
  • @RahulSaliya no.
  • 当我的应用不需要通知时,我确实找到了解决方法,即完全禁用通知。您的要求是什么?
  • 读取通知首选项并存储在文件中。我正在开发基于 root 的备份应用程序。
  • 如果您仍在从事该项目,请尝试以下答案。我的工作只是启用和禁用通知,所以我没有尝试过任何通知渠道。

标签: android adb android-notifications


【解决方案1】:

你可以试试

adb shell dumpsys notification

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

【讨论】:

  • 这应该是公认的答案,电话提供了所有通知渠道的所有必要信息
【解决方案2】:

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

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

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 输入它们只是我们在通知服务中调用的函数的参数。

您可以从这里找到服务调用的解释:

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

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多