• 检测Android应用的通知栏权限开启状态(已经适配8.0以上系统)


    import android.app.AppOpsManager;
    import android.app.NotificationManager;
    import android.content.Context;
    import android.content.pm.ApplicationInfo;
    import android.os.Build;
    import android.support.annotation.RequiresApi;
    import android.support.v4.app.NotificationManagerCompat;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class NotificationsCheckUtil {
        public static boolean areNotificationsEnabled(Context context) {
            NotificationManagerCompat.from(context).areNotificationsEnabled();
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                return true;
            }
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
                return isEnableV19(context);
            }else {
                return isEnableV26(context);
            }
        }
    
    
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        private static boolean isEnableV19(Context context) {
            final String CHECK_OP_NO_THROW = "checkOpNoThrow";
            final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
            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) {
            } catch (NoSuchMethodException e) {
            } catch (NoSuchFieldException e) {
            } catch (InvocationTargetException e) {
            } catch (IllegalAccessException e) {
            } catch (Exception e) {
            }
            return false;
        }
    
    
        private static boolean isEnableV26(Context context) {
            ApplicationInfo appInfo = context.getApplicationInfo();
            String pkg = context.getApplicationContext().getPackageName();
            int uid = appInfo.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;
            }
        }
    }
  • 相关阅读:
    DOM练习2动态增删表格行
    JS
    JS动态获取当前时间,并写到指定的区域
    DOM练习3选项批量移动
    JS练习显示隐藏图像
    修改MyEclipse默认工作路径
    Aptana 安装与配置
    DOM入门基本概念
    SecureCRT终端显示gcc编译错误提示乱码问题
    使用静态成员函数的一个错误。
  • 原文地址:https://www.cnblogs.com/loaderman/p/12218319.html
Copyright © 2020-2023  润新知