美文网首页android
【掌阅出品】android 8.0 获取通知栏开关状态

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

作者: 风无羽 | 来源:发表于2018-04-25 20:36 被阅读259次

    在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;
            }
        }
    
    

    相关文章

      网友评论

      • 3e0bb6e6091e:我这怎么不太管用,大佬
      • alin_lin:试了下,可以的,支持下
        风无羽:@awkflf11 欢迎关注,我会将安卓中遇到的坑和教训与你分享

      本文标题:【掌阅出品】android 8.0 获取通知栏开关状态

      本文链接:https://www.haomeiwen.com/subject/vxtulftx.html