Android 使用root清除状态栏通知

Android 使用root清除状态栏通知,android,Android,我目前正在使用辅助功能服务处理通知。特别恼人的是第三方应用程序无法清除状态栏通知,只能启动与通知链接的意图(并启动应用程序) 我已经搜索了很长一段时间,想找到一种方法使用root来取消通知或清除完整列表,但我失败了 我想我记得我看到的一个应用程序通过快速打开状态栏并通过编程方式单击清除按钮来清除状态栏,但我再也找不到它了,我想它是在Android 2.2上 我想知道是否有一种方法可以使用某种数据库或简单的SU呼叫与状态栏通知交互。更新-请参阅下面的工作解决方案 所有这些内容都由Notificat

我目前正在使用辅助功能服务处理通知。特别恼人的是第三方应用程序无法清除状态栏通知,只能启动与通知链接的意图(并启动应用程序)

我已经搜索了很长一段时间,想找到一种方法使用root来取消通知或清除完整列表,但我失败了

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


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

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

所有这些内容都由NotificationManagerService处理(请参见此处:)。我认为您尤其会对void cancelAll(int userId)方法感兴趣。当您在状态屏幕上按clear时,实际调用的方法就是该方法(使用ActivityManager.getCurrentUser()作为参数)

您可以尝试通过反射调用NotificationManager.getService(请参阅NotificationManager中的hidden getService()方法)来获取它的实例,然后尝试以某种方式调用返回服务上的cancelAll(例如,再次通过反射)

更新

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

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。您可以通过调用

service call notification 1

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