11

我目前正在开发一个使用辅助功能服务来处理通知的应用程序。尤其令人讨厌的是,第三方应用程序除了启动与通知链接的意图(并启动应用程序)外,无法清除状态栏通知。

我已经搜索了很长时间,以寻找一种使用 root 来关闭通知或清除完整列表的方法,但我失败了。

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

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

4

2 回答 2

4

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

所有这些东西都由 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中隐藏的 getService() 方法/NotificationManager.java)然后尝试以某种方式在返回的服务上调用 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 身份运行,但如果您具有 root 权限,则会成功清除通知,这将引发 SecurityException

于 2013-07-01T21:15:06.720 回答
4

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

service call notification 1

在具有 root 权限的 shell 中

于 2014-01-27T06:45:59.900 回答