gpt4 book ai didi

android - 如何知道android中的应用程序是否启用了通知?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:26:00 24 4
gpt4 key购买 nike

我有一个 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);

我得到以下异常:

Caused by: java.lang.SecurityException: uid 10062 does not have android.permission.UPDATE_APP_OPS_STATS. W/System.err: at android.os.Parcel.readException(Parcel.java:1683) W/System.err: at android.os.Parcel.readException(Parcel.java:1636) W/System.err: at com.android.internal.app.IAppOpsService$Stub$Proxy.checkOperation(IAppOpsService.java:343)

我已经包含了

<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS"/>

我仍然遇到同样的错误。用什么api可以获取是否被屏蔽的值

Using what apis can I get these values?

最佳答案

这恐怕只有当前的应用程序才有可能。这就是为什么 NotificationManager 的公共(public) API 具有针对当前包的函数 areNotificationsEnabled()

在查看 android 源代码时,我发现了 AppNotificationSettings - 应用程序通知设置。第一个开关指示通知是否被阻止。切换监听器是 here , 指向 NotificationBackend .在这个类中,有方法:

public boolean getNotificationsBanned(String pkg, int uid)

它使用 INotificationManager (编译期间从 .aidl 文件生成的类)及其方法:

boolean areNotificationsEnabledForPackage(String pkg, int uid);

这是Android私有(private)API,不能简单调用。所以我尝试反射(reflection):

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);

结论:

做不到。

关于android - 如何知道android中的应用程序是否启用了通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39832714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com