【问题标题】:checking if notifications are enabled for specific package检查是否为特定包启用了通知
【发布时间】:2018-06-18 09:53:34
【问题描述】:

我正在开发一个系统应用程序,我需要从我的应用程序中检查某个包是否启用了通知。

我一直在尝试这段代码:

public static boolean isNotificationEnabled(Context context) {

    AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);

    ApplicationInfo appInfo = context.getApplicationInfo();

    String pkg = context.getApplicationContext().getPackageName();

    int uid = appInfo.uid;

    Class appOpsClass = null; /* Context.APP_OPS_MANAGER */

    try {

        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, uid, pkg) == AppOpsManager.MODE_ALLOWED);

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    return false;
}

问题是它一直在返回 true。我做错了什么?

【问题讨论】:

标签: android reflection notifications root


【解决方案1】:

如果您的方法获得目标应用程序的Context(您要检查通知是否启用)。

您可以基于此Context 创建NotificationManagerCompat 实例并检查该应用程序是否启用了通知:

public static boolean isNotificationEnabled(Context context) {
    return NotificationManagerCompat.from(context.getApplicationContext())
            .areNotificationsEnabled();
}

【讨论】:

  • 我不明白...我不认为这就是我要找的东西
  • @Aldridge1991 你试过这种方法吗?您将什么上下文作为参数传递给您的方法?
  • 我不知道如何为不同的应用程序获取上下文...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2014-11-21
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多