阅读提醒
从Android6.0开始,如何实现在运行时请求权限
从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。
系统权限分为两类:正常权限和危险权限:
- 正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
- 危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。
实现步骤
检查权限 ContextCompat.checkSelfPermission
当应用需要危险权限时,则每次执行需要这一权限的操作时都必须检查是否具有该权限。因为用户始终可以自由调用此权限,所以即使应用昨天使用了相机,也不能假设今天仍具有该权限。通过调用 ContextCompat.checkSelfPermission() 方法,如果应用具有此权限将返回 PackageManager.PERMISSION_GRANTED,如果应用不具有此权限将返回 PackageManager.PERMISSION_DENIED。请求权限 ActivityCompat.requestPermissions
当检查尚未获取某项危险权限时,需要调用ActivityCompat.requestPermissions()方法进行请求权限。调用后将显示一个标准的 Android 对话框,次对话框不能进行自定义。解释为什么需要权限 ActivityCompat.shouldShowRequestPermissionRationale
如果应用在过去拒绝了此权限请求,该方法将返回 true。如果用户在过去拒绝了此权限请求,并在权限请求系统对话框中选择了 Don't ask again 选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。处理权限请求响应 onRequestPermissionsResult
当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用 onRequestPermissionsResult() 方法,向其传递用户响应。
Demo展示
以下通过获取联系人列表为例
Demo下载地址:https://github.com/JasonAnt/RequestAppPermission
public void onClickPhoneBook(View view) {
//Determine whether you have been granted a particular permissio
int checkStatus = ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.READ_CONTACTS);
if (PackageManager.PERMISSION_GRANTED == checkStatus) {//you have been granted a permission
navigatePhoneBook();
} else {//you don`t have been granted a permission
//Requests permissions to be granted to this application
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1001);
}
}
private void navigatePhoneBook(){
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 1001){
if(permissions[0].equals(Manifest.permission.READ_CONTACTS)){
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
// approve and have permission, and open then phone book
navigatePhoneBook();
}else{
//Gets whether you should show UI with rationale for requesting a permission.
boolean isShow = ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS);
if (!isShow){//Show the UI with rationale for requesting a permission.
Toast.makeText(this, "Show the UI with rationale for requesting a permission", Toast.LENGTH_SHORT).show();
}
}
}
}
}