您的位置:首页 > 其它

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

2017-08-25 16:32 302 查看

场景

默认情况,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测试,第一次弹出对话框询问是否同意授予权限,同意没问题;拒绝后再次进入界面,无对话框提示,即静默拒绝权限申请。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: