Использование root для очистки уведомлений о статусной строке

В настоящее время я работаю над приложением, используя службу доступности для обработки уведомлений. Особенно неприятно то, что сторонние приложения не могут очищать уведомления о статусной строке , кроме запуска намерения, связанного с уведомлением (и запуска приложения).

Я долго искал способ использовать root для отклонения уведомления или очистки полного списка, но я потерпел неудачу.

Я думаю, что я помню приложение, которое я видел, которое очистило строку состояния, быстро открыв строку состояния и щелкнув по кнопке очистки программно, но я больше не могу ее найти, и я думаю, что это было на Android 2.2.

Мне было интересно, есть ли способ взаимодействовать с уведомлениями о статусной строке с использованием какой-то базы данных или с простым вызовом SU .

Solutions Collecting From Web of "Использование root для очистки уведомлений о статусной строке"

ОБНОВЛЕНИЕ – см. Рабочий раствор ниже

Весь этот материал обрабатывается службой NotificationManagerService (см. Здесь: https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/NotificationManagerService.java ). Я думаю, в частности, вас будет интересовать метод void cancelAll (int userId). Когда вы нажимаете кнопку очистки на экране состояния, это метод, который фактически вызывается (с параметром ActivityManager.getCurrentUser ()).

Вы можете попытаться получить его экземпляр, вызвав NotificationManager.getService через отражение (см. Скрытый метод getService () в NotificationManager http://androidxref.com/4.2.2_r1/xref/frameworks/base/core/java/android/app /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); 

Это вызовет исключение SecurityException, если вы не используете его как root, но успешно очищает уведомления, если у вас есть права на root

Вы можете очистить все уведомления, позвонив

 service call notification 1 

В оболочке с правами root