美文网首页
运行时权限

运行时权限

作者: violinlin | 来源:发表于2017-08-03 18:48 被阅读73次

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

    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();
                }
    
            }
    
        }
    
    

    相关文章

      网友评论

          本文标题:运行时权限

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