【掌阅出品】android 8.0 获取通知栏开关状态

在app开发过程中需要获取通知栏开关的状态
1.针对8.0之前设备,通过AppOpsManager的checkOpNoThrow方法获取。

 public static boolean isEnableV19(Context context, String pkg, int uid) {
        try {
            String CHECK_OP_NO_THROW = "checkOpNoThrow";
            String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
            Class appOpsClass = null;
            AppOpsManager mAppOps = null;
            mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
            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 = (Integer) opPostNotificationValue.get(Integer.class);
            return ((Integer) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) ==
                    AppOpsManager.MODE_ALLOWED);
        } catch (Exception e) {
            return true;
        }
    }

2.针对8.0及以上设备,发现上述方式不生效。查询系统设置源码,在NotificationBackend类中发现获取通知栏状态改到INotificationManager中了

    public boolean getNotificationsBanned(String pkg, int uid) {
       try {
            final boolean enabled = sINM.areNotificationsEnabledForPackage(pkg, uid);
            return !enabled;
       } catch (Exception e) {
            Log.w(TAG, "Error calling NoMan", e);
            return false;
        }
    }

提供给APP适用的的NotificationManager 类中有INotificationManager 对象,最终我们通过反射获取通知栏开关

    public static boolean isEnableV26(Context context, String pkg, int uid) {
        try {
            NotificationManager notificationManager = (NotificationManager)
                    context.getSystemService(Context.NOTIFICATION_SERVICE);
            Method sServiceField = notificationManager.getClass().getDeclaredMethod("getService");
            sServiceField.setAccessible(true);
            Object sService = sServiceField.invoke(notificationManager);

            Method method = sService.getClass().getDeclaredMethod("areNotificationsEnabledForPackage"
                    , String.class, Integer.TYPE);
            method.setAccessible(true);
            return (boolean) method.invoke(sService, pkg, uid);
        } catch (Exception e) {
            return true;
        }
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,800评论 25 709
  • 最近老有朋友跟我抱怨,自己是婚姻生活里的受害者。他对自己家人付出太多,对我关心很少,冷暴力太多,我自己又玻璃心。那...
    女龙1阅读 3,408评论 0 0
  • 几时归去,作个闲人。对一张琴、一壶酒、一溪云。 ——苏轼 《行香子》 2017.5...
    Mengjc阅读 2,523评论 0 0

友情链接更多精彩内容