美文网首页
运行时权限

运行时权限

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

        }

    }

相关文章

  • Android - base - 运行时权限获取

    Android 6.0 引入的运行时权限机制 大纲 运行时权限机制简介 在程序运行时申请权限 #运行时权限机制简介...

  • 【Susen】目录

    Android运行时权限Android运行时权限列表EasyPermissionsAndPermissionPer...

  • 运行时权限

    1.运行时权限  以下权限需要进行运行时权限处理:  以CALL_PHONE为例,进行运行时权限申请:   第一步...

  • 无标题文章

    Android 6.0 运行时权限处理 标签(空格分隔): android 运行时权限介绍 Android 6.0...

  • 新特性与行为变更 -- 代码2

    运行时权限 运行时权限 在应用间共享文件 FileProvider 计划排定作业 JobIntentService...

  • Android优雅地申请动态权限

    Android6.0以上的系统中,引入了运行时权限检查,运行时权限分为正常权限和危险权限,当我们的App调用了需要...

  • Android 6.0变更一览

    Android 6.0 API 运行时权限 运行时申请权限,需要targetSDK>=23,并且手机的系统大于6....

  • 版本升级坑

    Android6.0 1.运行时权限 Android 6.0 运行时权限管理最佳实践:https://blog.c...

  • Android-6.0 棉花糖权限的那点事

    Android6.0引入了全新的权限管理方式,也就是运行时权限,至于什么是运行时权限,我们先看一下6.0以前的权限...

  • Android 6.0 运行时权限处理完全解析

    Android 6.0 运行时权限处理完全解析 运行时权限的变化及特点 对于6.0以下的权限及在安装的时候,根据权...

网友评论

      本文标题:运行时权限

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