6.0权限动态适配(一)(存在问题)

来源:互联网 发布:360数据恢复软件比较差 编辑:程序博客网 时间:2024/06/03 16:42

场景

默认情况,APP不获取任何权限。当APP需使用任何被设备保护权限,如发送网络请求、拍照、发送短信等,须由开发者获取对应权限。Android6.0前,开发者获取权限非常简单,只需要在AndroidManifest.xml文件中申明,所有权限会在安装时处理。比如用户安装APP,安装前系统弹出对话框,用户可浏览该应用所获取设备权限有哪些。但是用户安装权限后无任何更改机会。虽利于开发者处理权限,但对用户而言,体验效果并不好。Android6.0显著改变是支持用户随时更改APP权限,即便APP正在运行中。

分类

Android6.0把权限分常规权限、运行时权限两种。

常规权限

释义

对于常规权限,只需在AndroidManifest.xml文件中申明即可。系统不会弹出任何提示用户是否开启权限弹窗,即静默权限,包括网络访问、获取网络状态等。

运行时权限

释义

所需权限不在常规权限范围内,便需在代码中动态获取权限,系统会弹出弹窗提示户是否开启权限。

步骤

  • 在AndroidManifest.xml文件中申明所需运行时权限

  • 代码动态获取。代码如下:

    /*     * Called when the user is performing an action which requires the app to take photos.     * */    private void requestTakePhotosPermission() {        /*        * Use the support library version ContextCompat.        * checkSelfPermission(...) to avoid checking the build version since Context.        * checkSelfPermission(...) is only available in Marshmallow.        * Always check for permission (even if permission has already been granted) since the user can revoke permissions at any time through Settings.        * 参数 上下文、权限、请求码        * */        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {            /*            * The permission is NOT already granted.            * Check if the user has been asked about this permission already and denied it.            * If so, we want to give more explanation about why the permission is needed.            * 第一次被拒绝,第二次访问时,提示用户为什么需要此权限            * */            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CAMERA)) {                /*                * Show our own UI to explain to the user why we need to use the permission and showing the default UI                * */            }            /*            * Fire off an async request to actually get the permission.            * This will show the standard permission request dialog UI.            * 权限没有开启,请求权限            * */            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 1);        } else {            // 执行动作        }    }    /*    * Callback with the request from calling requestPermissions(...)    * 用户接受或者拒绝,申请权限会执行一个回调    * */    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            // Make sure it's our original Permission request            case 1:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    // 执行动作                } else {                    ToastShort("获取权限失败!");                }                break;            default:                super.onRequestPermissionsResult(requestCode, permissions, grantResults);                break;        }    }

引申

权限Groups

APP需大量权限时,若让开发者每次针对所需运行时权限弹出弹窗,显然是动态获取权限滥用。而权限群允许APP在某时间点同时申请多个权限。但请注意,大多数情况下,还是应单独获取单个权限。但例如下面情况,当需获取读取联系人权限,向用户申请,处理完后,需写权限,又向用户申请,此时可为它们设置权限群,当申明读取联系人权限同时,申请写权限,如此便不必再次申请写权限。

问题

使用小米4S测试,第一次弹出对话框询问是否同意授予权限,同意没问题;拒绝后再次进入界面,无对话框提示,即静默拒绝权限申请。

原创粉丝点击