簡體   English   中英

如何知道Android中的應用程序是否啟用了通知?

[英]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我可以得到它是否被阻止的值

使用什么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);

結論:

無法做到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM