当前位置: 首页 > news >正文

Android开发检查是否开启通知栏权限

Android开发检查是否开启通知栏权限

检查通知权限很场景,几乎每个app都有。 顺便提供跳到设置里面开启通知栏

一、查询是否有通知栏权限:

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public static boolean isNotificationEnabled(Context context) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //8.0手机以上
            if (((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE)).getImportance() == NotificationManager.IMPORTANCE_NONE) {
                return false;
            }
        }

        String CHECK_OP_NO_THROW = "checkOpNoThrow";
        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 = (Integer) opPostNotificationValue.get(Integer.class);
            return ((Integer) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) == AppOpsManager.MODE_ALLOWED);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

二、跳到设置里面开启通知

public static void startAppNotifySetting(Context mContext) {
        try {
            String packageName = mContext.getPackageName();
            int uid = mContext.getApplicationInfo().uid;
            Intent intent = new Intent();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
                intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName);
                intent.putExtra(Settings.EXTRA_CHANNEL_ID, uid);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
                intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                intent.putExtra("app_package", packageName);
                intent.putExtra("app_uid", uid);
            } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT){
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setData(Uri.fromParts("package", packageName, null));
            } else {
                intent.setAction(Settings.ACTION_SETTINGS);
            }
            mContext.startActivity(intent);
        } catch (Exception e){
            e.printStackTrace();
            Intent intent = new Intent();
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            intent.setData(Uri.fromParts("package", mContext.getPackageName(), null));
            mContext.startActivity(intent);
        }

    }

相关文章:

  • Elasticsearch未授权访问漏洞
  • Android Token的原理和本地安全存储
  • C++基础 [八] - list的使用与模拟实现
  • LeetCode热题100精讲——Top2:字母异位词分组【哈希】
  • 鲲鹏服务器,系统为:openEuler22.03-LTS (aarch64)Dify 安装教程(详细版)
  • 开发中常用的设计模式 用法及注意事项【面试题】
  • 路由工程师大纲-2:结合AI技术构建路由拓扑与BGP异常检测的知识链体系
  • (UI自动化测试web端)第二篇:元素定位的方法_xpath路径定位
  • 第七章 | Solidity 合约继承与接口全面讲解
  • Git冲突解决
  • MySQL的InnoDB 与 MyISAM 在性能方面不同,适应不同系统的说明
  • 基于C语言实现的观察者模式 以温度监控系统为例
  • python实战,提取数据汇聚到表格中
  • 数据结构--顺序表(实现增删改查)
  • 【C++初阶】---类和对象(上)
  • Vue.js 应用的入口文件main.js
  • BetterDiscord macOS
  • win7忘记密码_通过MS17-010打进去_创建管理员账户
  • 做一个有天有地的css及html画的旋转阴阳鱼
  • Next.js中not-found.js触发方式详解
  • 北京今日白天超30℃晚间下冰雹,市民称“没见过这么大颗的”
  • 第四届长三角国际应急博览会开幕,超3000件前沿装备技术亮相
  • 回望乡土:对媒介化社会的反思
  • 有关部门负责人就《新时代的中国国家安全》白皮书答记者问
  • “一节课、两小时”,体育正在回归“C位”
  • 西甲上海足球学院揭幕,用“足球方法论”试水中国青训