Uso de root para borrar las notificaciones de la barra de estado

Actualmente estoy trabajando en una aplicación que utiliza un servicio de accesibilidad para manejar las notificaciones. Lo que es particularmente molesto es que no hay manera de que las aplicaciones de terceros borren las notificaciones de la barra de estado , aparte de lanzar la intención vinculada a la notificación (e iniciar la aplicación).

He buscado durante mucho tiempo una forma de usar root para descartar una notificación o borrar la lista completa, pero he fallado.

Creo que recuerdo una aplicación que vi que se aclaró la barra de estado abriendo rápidamente la barra de estado y haciendo clic en el botón de borrar mediante programación, pero no puedo encontrar más, y creo que fue en Android 2.2.

Me preguntaba si había una manera de interactuar con las notificaciones de la barra de estado usando algún tipo de base de datos o con una simple llamada de SU .

ACTUALIZACIÓN – Ver solución de trabajo a continuación

Todas estas cosas son manejadas por el NotificationManagerService (ver aquí: https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/NotificationManagerService.java ). Creo que en particular estarías interesado en el método void cancelAll (int userId). Cuando presione borrar en la pantalla de estado que es el método que realmente se invoca (con ActivityManager.getCurrentUser () como parámetro).

Puede intentar obtener una instancia de la misma llamando a NotificationManager.getService a través de la reflexión (ver método getService () ocultos en NotificationManager http://androidxref.com/4.2.2_r1/xref/frameworks/base/core/java/android/app /NotificationManager.java ) y luego intentar de alguna manera invocar cancelAll en el servicio devuelto (por ejemplo, mediante la reflexión de nuevo).

ACTUALIZAR

He encontrado una forma más fácil de borrar las notificaciones a través del servicio de barra de estado. El código siguiente debería funcionar:

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); 

Esto lanzará una excepción de seguridad si no se está ejecutando como root pero elimina las notificaciones con éxito si tiene permisos de root

Puede borrar todas las notificaciones llamando al

 service call notification 1 

En el shell con permiso de root

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.