引言
从 Android 6.0(API 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。这种权限机制可以让用户更好的管理应用的权限,保障用户隐私。
系统权限分类
- 正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
- 危险权限会授予应用访问用户机密数据的权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。危险权限共分为9组24个,也就是说只要用户允许了每一组中的一条权限。就代表他允许了这个组中的全部权限。
注意事项
- 在 Android 5.1(API 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在安装时要求用户授予权限。(沿用之前的权限系统)
- 即使在安装时已经授予应用所有权限,在Android 6.0之后依然可以通过 “Setting” 来关闭已经授予的权限。
- 在请求权限时,系统只告诉用户应用需要的权限组,而不告知具体权限。
- 如果在未检查授权的情况下,直接使用危险权限,会导致程序Crash。
- 使用 v4 包中的 ContextCompat 处理权限(v13 包中的FragmentCompat),不需要考虑版本问题。
实现方式
话不多说直接看代码
// 声明一个数组,用来存储所有需要动态申请的权限。这里写的是同时申请多条权限,如果你只申请一条那么你就在数组里写一条权限好了
String[] permissions = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CAMERA};
// 同时我们可以声明一个集合,用来存储用户拒绝授权的权限。
List<String> mPermissionList = new ArrayList<>();
private void checkPermission() {
mPermissionList.clear();
/**
*PackageManager.PERMISSION_GRANTED 表示有权限, PackageManager.PERMISSION_DENIED 表示无权限。
* 判断哪些权限未授予
* 以便必要的时候重新申请
*/
for (String permission : permissions) {
//判断所要申请的权限是否已经授权
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permission);
}
}
/**
* 判断存储委授予权限的集合是否为空
*/
if (!mPermissionList.isEmpty()) {
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);//请求指定授权
} else {//未授予的权限为空,表示都授予了
}
}
//重写onRequestPermissionResult方法来处理授权结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
//判断是否勾选禁止后不再询问
//如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permissions[i]);
if (showRequestPermission) {
//这里可以做相关操作,我这里是写的是重新申请权限
checkPermission();//重新申请权限
return;
} else {
//做相关操作。。。
}
}
}
break;
default:
break;
}
}
总结
其实仔细想想,动态权限申请其实也就那么几句话。多熟悉一下,应该可以很快掌握。对了最后还有一点,你要申请的动态权限不要忘了在清单文件中也要,静态的申明一下。不然还是会报错的。。。。。。