Android6.0后权限设置

2019-08-14 10:11:17 浏览数 (1)

android6.0之后我们的应用某些权限是动态设置,而非像之前安装之后就提示用户开启哪些权限,但是如果我们没有设置动态授权的话,就会出现界面崩溃的现象,下面我们来讲一下如何像之前一样安装后提示授权,从而避免因未授权而导致的崩溃现象。

  • 第一种方法 将targetSdkVersion设置为23以下。 因为targetSdkVersion>=23时,系统将会自动采用动态权限管理策略,如果你在涉及到特殊权限操作时没有申请权限权限而直接调用了相关代码,你的App可能就崩溃了!
  • 第二种方法(也就是此篇文章说要讲的) 首先你需要在你的清单文件中找出你所注册的权限并将它们依次放到数组中,如下:
代码语言:javascript复制
    String[] permissions = {Manifest.permission.GET_ACCOUNTS, Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA, Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};

然后调用如下方法依次进行授权即可。

代码语言:javascript复制
   public void applyPermission() {
        for (int i = 0; i < permissions.length; i  ) {
            if (Build.VERSION.SDK_INT >= 23) {
                int check = ContextCompat.checkSelfPermission(this, permissions[i]);
                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
                if (check == PackageManager.PERMISSION_GRANTED) {
                } else {
                    requestPermissions(new String[]{Manifest.permission.GET_ACCOUNTS, Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA, Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                }
            } else {
            }
        }
    }

要记得重写授权的回调

代码语言:javascript复制
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        } else {
            // 没有获取 到权限,从新请求,或者关闭app
            Toast.makeText(this, "没有获取 到权限,从新请求,或者关闭app", Toast.LENGTH_SHORT).show();
        }
    }

以上代码即可实现动态授权,那什么时候调用呢,我是将他们写在BaseActivity中,然后在启动页调用applyPermission();方法即可。 效果图如下:

引用一下高德的启动页

0 人点赞