Android权限机制
1.简介
Android6.0之后将权限分为普通权限和危险权限(特殊权限使用较少,在此不多做介绍)
普通权限指不会威胁到用户的安全和隐私的权限,这部分权限只需要在清单文件中申请,安装程序的时候,系统会自动帮我们进行授权. 危险权限指那些可能会涉及用户隐私或对系统安全造成影响。这些权限在6.0之后不仅要在清单文件中说明,在运行时也需要手动申请,用户同意之后方可使用。
2.手动在代码中申请的权限需要在配置文件中声明。下面的代码可以放在BaseActivity中,在后续使用时调用即可
//申请的权限的集合
private static final String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE
, Manifest.permission.READ_PHONE_STATE
, Manifest.permission.READ_EXTERNAL_STORAGE
, Manifest.permission.CAMERA};
/**
* 申请权限
*/
public void requestPermission() {
ArrayList<String> pers = new ArrayList<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (int i = 0; i < mPermissionList.length; i++) {
String per = mPermissionList[i];
//如果该权限没有申请,将其加入到集合中
if (checkSelfPermission(per) != PackageManager.PERMISSION_GRANTED) {
pers.add(per);
}
}
if (pers.size() != 0) {
String[] perPars = pers.toArray(new String[pers.size()]);
//执行申请权限的方法,并将执行结果穿回到onRequestPermissionsResult方法中
ActivityCompat.requestPermissions(this, perPars, 123);
}
}
}
/**
* 请求权限方法的回调结果
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (requestCode == 123) {
//遍历集合
for (int i = 0; i < grantResults.length; i++) {
//如果有权限没有被同意
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
//提示用户打开app所需权限,这里是封装的Toast方法,也可自行处理后续业务
SnackBarUtils.showToast(this, R.string.request_app_permission);
break;
}
}
}
}
}