zoukankan      html  css  js  c++  java
  • 检测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;
            }
        }
    }
  • 相关阅读:
    【LeetCode】336.回文对(前缀树,散列,暴力三种方法,java实现)
    Python爬虫入门教程 72-100 分布式爬虫初步解析-配好环境肝完一半
    net.ipv4.tcp_max_tw_buckets=10
    tcp_fin_timeout
    程序停掉close_wait立马回收
    net.ipv4.tcp_tw_reuse = 1 重用time_wait
    做了3年数据报表却毫无进步?看过这3种方法的人,都被领导重视了
    【LeetCode】212.单词搜索 II (前缀树两种方法实现)
    Linux C/C++编程之(十三)系统IO函数
    《java入门第一季》之面向对象匿名内部类面试题
  • 原文地址:https://www.cnblogs.com/loaderman/p/12218319.html
Copyright © 2011-2022 走看看