1 背景
基于android系统的权限管理方式越来越完善, 在android6.0(api23)开始, 用户开始再应用运行时授予权限,而不是在应用安装是授予。
android是一个权限分割的操作系统, 每个应用都运行在分隔的安全沙箱中, 如果需要该应用访问系统的沙箱数据操作, 首先需要获取到该应用的接口访问权限。
须知
- 如果应用一味的要求用户授予权限, 可能会让用户感到无所适从, 极有可能会不使用您的应用, 甚至会采用措施直接卸载掉。
- android对权限进行了分组, 大致分为 正常权限和危险权限, 详情可点击阅读。
权限等级
正常权限不会给用户隐私带来风险,在应用的清单文件中声明使用, 如果声明该应用即可被直接赋予权限使用。
危险权限会授予应用访问用户机密数据的权限。 危险权限在清单文件声明之后, 才有资格在运行时动态的向用户申请。
系统处理权限的差异性
- 如果你的应用运行在Android5.1或更低版本, 或者运行在SDK 22或更低, 所有权限需要在文件中声明, 安装应用时需要用户明确的授予权限; 如果用户没有授予, 那么根本就不会安装应用。
- 如果你的应用运行在Android6.0或更高版本, 或者运行在SDK 23或更高, 所有权限需要在文件中声明, 在应用运行时, 需要用户明确的授予该危险权限; 如果用户没有给予该权限, 那么应用仍然可以继续运行除此权限外其余的功能。
检查权限
-
支持android6.0及以上
要检查您的应用是否具备该项权限, 可调用
方法。 例如, 以下示例代表是否具有读取短信功能。ContextCompat.checkSelfPermission()
方法将会返回int state = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS);
,PackageManager.PERMISSION_GRANTED
PackageManager.PERMISSION_DENIED
如果应用已经具备该权限,则会返回
PERMISSION_GRANTED
, 如果当前并不具备该权限则返回
PERMISSION_DENIED
请求权限
应用可在开发中在清单文件中声明所需要的清单文件, 但是需要用户明确告诉系统该应用是否能够具备, 调用系统的请求权限方法可以显示一个弹出框提供给用户进行选择(这个弹出框开发者不能对他进行自定义)
开发者可以直接在
Activity
中调用
requestPermissions()
方法请求所需权限,请求方法会在异步执行, 并能够通过重写
onActivityResult
方法来得知权限是否被用户授予。
以下代码可以检查应用是否具备读取用户短信的权限,并根据需要请求该权限:
final int PERMISSION_RESULT = ;
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, PERMISSION_RESULT);
}
处理权限请求响应
当用户已对当前请求作出响应时,系统会通过
onRequestPermissionsResult
方法返回请求结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == PERMISSION_RESULT){
if (grantResults.length > && grantResults[] == PackageManager.PERMISSION_GRANTED) {
// 用户响应成功授予
} else{
// 用户响应禁止采用该权限
}
}
}
如果希望能够更加深入了解android的权限机制, 可参考文档.