美文网首页Android 版本兼容
Android 应用获取通知栏权限是否开启,并跳转设置界面

Android 应用获取通知栏权限是否开启,并跳转设置界面

作者: 阿豪02 | 来源:发表于2018-02-23 18:03 被阅读0次

    因为项目要用到推送功能,所以需要知道用户是否开启了通知栏的权限,并且可以方便直接跳转到权限设置以便用户进行开启。

    1. 获取权限工具类
    public class NotificationsUtils {
    
        private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
        private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
    
        @SuppressLint("NewApi")
        public static boolean isNotificationEnabled(Context context) {
    
            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;
        }
    }
    
    1. 跳转到应用权限设置界面
        if (!NotificationsUtils.isNotificationEnabled(this)) {
                final AlertDialog dialog = new AlertDialog.Builder(this).create();
                dialog.show();
    
                View view = View.inflate(this, R.layout.dialog, null);
                dialog.setContentView(view);
    
                TextView context = (TextView) view.findViewById(R.id.tv_dialog_context);
                context.setText("检测到您没有打开通知权限,是否去打开");
    
                TextView confirm = (TextView) view.findViewById(R.id.btn_confirm);
                confirm.setText("确定");
                confirm.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        dialog.cancel();
                        Intent localIntent = new Intent();
                        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        if (Build.VERSION.SDK_INT >= 9) {
                            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                            localIntent.setData(Uri.fromParts("package", MainActivity.this.getPackageName(), null));
                        } else if (Build.VERSION.SDK_INT <= 8) {
                            localIntent.setAction(Intent.ACTION_VIEW);
    
                            localIntent.setClassName("com.android.settings",
                                    "com.android.settings.InstalledAppDetails");
    
                            localIntent.putExtra("com.android.settings.ApplicationPkgName",
                                    MainActivity.this.getPackageName());
                        }
                        startActivity(localIntent);
                    }
                });
    
                TextView cancel = (TextView) view.findViewById(R.id.btn_off);
                cancel.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        dialog.cancel();
                    }
                });
          }
    

    相关文章

      网友评论

        本文标题:Android 应用获取通知栏权限是否开启,并跳转设置界面

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