[英]How to know whether Notifications are enabled or not for an application in android?
我有一個ListView,其中包含已安裝的應用程序列表,對於每個應用程序,我需要知道是否啟用了通知。 目前我正在使用下面的代碼來了解是否啟用了通知:
appOpsClass = Class.forName(AppOpsManager.class.getName());
Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class);
Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
int value = (int)opPostNotificationValue.get(Integer.class);
return ((int)checkOpNoThrowMethod.invoke(mAppOps,value, appUID, appPackage) == AppOpsManager.MODE_ALLOWED);
我得到以下異常:
引起:java.lang.SecurityException:uid 10062沒有android.permission.UPDATE_APP_OPS_STATS。 W / System.err:在android.os.Parcel.readException(Parcel.java:1683)W / System.err:在android.os.Parcel.readException(Parcel.java:1636)W / System.err:at com .android.internal.app.IAppOpsService $存根$ Proxy.checkOperation(IAppOpsService.java:343)
我已經包括在內了
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS"/>
我仍然得到同樣的錯誤。 使用什么apis我可以得到它是否被阻止的值
我擔心這只適用於當前的應用程序。 這就是為什么NotificationManager
的公共API具有當前包的函數areNotificationsEnabled()
的原因。
在查看android源代碼時,我發現了AppNotificationSettings
- 應用程序通知設置。 第一個開關指示通知是否被阻止。 切換偵聽器在這里 ,指向NotificationBackend
。 在這個類中,有方法:
public boolean getNotificationsBanned(String pkg, int uid)
其使用INotificationManager
(從生成的類.aidl
編譯期間文件)和它的方法:
boolean areNotificationsEnabledForPackage(String pkg, int uid);
這是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);
結論:
無法做到。
看看你是否可以使用NotificationManagerCompat.areNotificationsEnabled() https://developer.android.com/reference/android/support/v4/app/NotificationManagerCompat.html#areNotificationsEnabled()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.