Ответ 1
Я боюсь, что это возможно только для текущего приложения. Вот почему public API NotificationManager
имеет функцию areNotificationsEnabled()
для текущего пакета.
Изучая исходный код Android, я нашел AppNotificationSettings
- настройки уведомлений приложения. Первый переключатель указывает, заблокированы ли уведомления или нет. Слушатель коммутатора здесь, который указывает на NotificationBackend
. В этом классе существует метод:
public boolean getNotificationsBanned(String pkg, int uid)
который использует INotificationManager
(класс, сгенерированный из файла .aidl
во время компиляции) и его метод:
boolean areNotificationsEnabledForPackage(String pkg, int uid);
Это частный API для Android, который нельзя просто вызвать. Поэтому я пробовал размышлять:
try {
NotificationManager mNotificationManager = null;
Class<?> c = Class.forName("android.app.NotificationManager");
Method method = c.getMethod("getService");
Object obj = method.invoke(mNotificationManager);
Class<?> clazz = Class.forName("android.app.INotificationManager$Stub$Proxy");
Method areNotificationsEnabledForPackage = clazz.getMethod("areNotificationsEnabledForPackage", String.class, int.class);
boolean blocked = (boolean) areNotificationsEnabledForPackage.invoke(obj, getPackageName(), android.os.Process.myUid());
Log.d(MainActivity.class.getSimpleName(), String.valueOf(blocked));
} catch (Exception e) {
e.printStackTrace();
}
Однако, как вы можете видеть, вы должны сначала создать NotificationManager
. К сожалению, этот класс создан для пакета. Поэтому приведенный выше код будет использоваться только для:
boolean blocked = (boolean) areNotificationsEnabledForPackage.invoke(obj, getPackageName(), android.os.Process.myUid());
однако это не сработает:
//InvocationTargetException will be thrown.
boolean blocked = (boolean) areNotificationsEnabledForPackage.invoke(obj, "com.android.camera", 10040);
Вывод:
Невозможно выполнить.