Android在运行时请求权限

阅读提醒

从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();
        }
      }
    }
  }
}

你可能感兴趣的:(Android在运行时请求权限)