Android 6.0以上权限学习

"6.0以上权限学习"

Posted by Daisy on January 29, 2015

“来了解Android的权限. ”

安卓6.0之上需要动态申请权限,Google 官方的定义为下方

从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。用户可以随时进入应用的“Settings”屏幕调用权限。

系统权限分为两类

  1. 正常权限不会给用户带去风险,在清单文件中直接生命就可以。系统会直接同意 、
  2. 危险权限需要用户手动给予权限

对于正常权限来说不用去动态申请,危险权限需要。下方为Android系统上所有的危险权限


 

下面来写一下Android原生的权限动态申请流程

  • 1.获取权限申请情况
int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); // 权限需要事先在清单文件中声明
  • 2.申请权限
int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
// 如果用户没有授予权限
if (permission != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.CAMERA},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);
} else {

}
  • 3.权限申请回调
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            } else {

            }
            break;
    }
}

 

有几下几点需要注意

  • 申请权限如果用户选择don't ask again,那么无论你怎么提示,都不会再出现权限的提示框
  • 权限申请不是一次申请日后都有效,因为用户可能在设置中对已经获得权限的应用禁止权限
  • 权限申请对一个权限组内的权限通用,例如,假设你在应用列出了 READ_CONTACTS 和 WRITE_CONTACTS。如果你请求了READ_CONTACTS且用户允许了权限,那么,当你对WRITE_CONTACTS进行申请时,不会再出现提示框,而会直接允许。
  • 当用户选择don't ask again,不会再出现提示框,第一条已经说过,这时总是会回调onRequestPermissionsResult并返回 denied。其后的所有类似操作都会回调onRequestPermissionsResult并返回 denied。