【问题标题】:Using root to clear the status bar notifications使用root清除状态栏通知
【发布时间】:2013-02-19 08:53:04
【问题描述】:

我目前正在开发一个使用无障碍服务来处理通知的应用。尤其烦人的是第三方应用无法清除状态栏通知,只能启动与通知相关联的意图(并启动应用)。

我找了很长时间使用root关闭通知或清除完整列表的方法,但我失败了。

我想我记得我看到的一个应用程序通过快速打开状态栏并以编程方式单击清除按钮来清除状态栏,但我再也找不到它了,我认为它是在 Android 2.2 上。

我想知道是否有办法使用某种数据库或简单的SU调用与状态栏通知进行交互。

【问题讨论】:

  • 据我所知,状态栏通知也被需要root权限的应用程序使用。其原因是,如果它们正在运行一些后台进程,由于状态栏通知,Android 自身无法停止杀死进程/或应用程序。您想清除被其他应用程序占用的状态栏 - 对吧?
  • @g00dy 简而言之,我想关闭任何非持续通知(电子邮件、短信等,但不是语音邮件、USB 调试),无论它是否来自我的应用程序。我知道这不能通过公共 SDK 完成。只是想知道是否有人使用 Root 管理它。

标签: android


【解决方案1】:

更新 - 请参阅下面的工作解决方案

所有这些东西都由 NotificationManagerService 处理(见这里:https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/NotificationManagerService.java)。我认为您尤其会对 void cancelAll(int userId) 方法感兴趣。当您在状态屏幕上按 clear 时,这就是实际调用的方法(使用 ActivityManager.getCurrentUser() 作为参数)。

您可以尝试通过反射调用 NotificationManager.getService 来获取它的实例(参见 NotificationManager http://androidxref.com/4.2.2_r1/xref/frameworks/base/core/java/android/app/NotificationManager.java 中隐藏的 getService() 方法),然后尝试以某种方式在返回的服务上调用 cancelAll(例如再次通过反射)。

更新

我找到了一种通过状态栏服务清除通知的更简单方法。以下代码应该可以工作:

IBinder b = (IBinder) Class.forName("android.os.ServiceManager").getMethod("getService", new Class[] {
    String.class
}).invoke(null, new Object[] {
    "statusbar"
});

Object iFace = Class.forName("com.android.internal.statusbar.IStatusBarService$Stub").getDeclaredMethod("asInterface", new Class[] {
    IBinder.class
}).invoke(null, new Object[] {
    b
});

iFace.getClass().getMethod("onClearAllNotifications", new Class[0]).invoke(iFace, (Object[]) null);

如果您不是以 root 身份运行,则会引发 SecurityException,但如果您具有 root 权限,则会成功清除通知

【讨论】:

    【解决方案2】:

    您可以通过调用清除所有通知

    service call notification 1
    

    在具有root权限的shell中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多