运行时权限

Android6.0中新添加了运行时权限,对于一些敏感的权限系统要求等用户确认授予权限后才可使用。如果没做Android6.0的适配在Android6.0的设备上并且apk的目标版本高于23,一些功能可能因为未能获取权限而崩溃。
运行时权限官方文档

运行时权限_第1张图片
image.png

下面以获取打开相册权限为例,了解下运行时权限的适配处理,需要处理的敏感权限信息同时也应该在清单文件中声明。

检查是否已获得相应权限

if (ContextCompat.checkSelfPermission(view.getContext(), Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) 

未获取相应权限

如果还没有获取相应权限通过下面的方法申请

 ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA}, 100);

系统会弹窗对话框像用户申请权限,用户同意或拒绝都会在onRequestPermissionsResult方法中回调

回调方法参数中会有请求码,申请的权限数组和申请结果数组,如果对应的返回结果是PERMISSION_GRANTED代表用户同意了该请求。
Fragment中和Activity中请求获取权限的方法稍有不同,上面的方法如果在Fragment中不能成功获取回调。在Fragment中应使用requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA}, 100);

 if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                Intent intent = new Intent(Intent.ACTION_PICK, null);
                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(intent, 1001);
            }else {
                Snackbar.make(getWindow().getDecorView(),"获取权限被拒绝",Snackbar.LENGTH_SHORT)
                        .show();
            }

此外系统提供了另外一个方法,当你申请的权限被拒绝时可以向用户接受获取该权限的原因的api,但检查没有获取到权限可以加层判断解释获取的原因。

 if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) {

                Snackbar.make(view,"请求获取打开相册权限",Snackbar.LENGTH_SHORT)
                        .setAction("OK", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                ActivityCompat.requestPermissions(MainActivity.this,
                                        new String[]{Manifest.permission.CAMERA}, 100);
                            }
                        }).show();


            }

已经获取相应权限

如果已经获取了权限,则直接走打开相册的代码逻辑

 Intent intent = new Intent(Intent.ACTION_PICK, null);
            intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intent, 1001);

获取权限主要代码如下

 private void showCamera(View view) {

        if (ContextCompat.checkSelfPermission(view.getContext(), Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            Log.i("whl", "请求获取权限");
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) {

                Snackbar.make(view,"请求获取打开相册权限",Snackbar.LENGTH_SHORT)
                        .setAction("OK", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                ActivityCompat.requestPermissions(MainActivity.this,
                                        new String[]{Manifest.permission.CAMERA}, 100);
                            }
                        }).show();


            } else {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.CAMERA}, 100);

            }


        } else {
            Log.i("whl", "获取了相机权限");

            Intent intent = new Intent(Intent.ACTION_PICK, null);
            intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intent, 1001);
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.i("whl",permissions[0]+"----"+grantResults[0]);
        if (requestCode==100){
            if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                Intent intent = new Intent(Intent.ACTION_PICK, null);
                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(intent, 1001);
            }else {
                Snackbar.make(getWindow().getDecorView(),"获取权限被拒绝",Snackbar.LENGTH_SHORT)
                        .show();
            }

        }

    }

你可能感兴趣的:(运行时权限)