恐怕这只能用于当前的应用程序.这就是为什么NotificationManager的公共API具有当前包的函数areNotificationsEnabled().
当查找android源代码时,我发现了AppNotificationSettings – 应用程序通知设置.第一个开关指示通知是否被阻止.开关监听器是here,指向NotificationBackend.在这个类中,有一个方法:
它使用INotificationManager(在编译期间从.aidl文件生成的类),它的方法:
这是Android私有API,不能简单地调用.所以我试过反思:
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);
结论:
不能做