Android6.0运行时权限请求
Android在SDK23(Android 6.0)之后将权限作了区分,一种是普通权限,一种是6.0权限也就是危险权限。普通权限和之前的没有什么区别,而危险权限除了需要在
Manifest
中进行声明外还需要在运行时进行手动申请,只有在申请后用户同意了才能使用该权限。
权限与版本兼容
- 手机版本<23 & targetSdkVersion<23
默认获得所有权限 - 手机版本<23 & targetSdkVersion>23
默认获得所有权限 - 手机版本>23 & targetSdkVersion<23
默认获得所有权限,用户可以自行在应用管理进行关闭 - 手机版本>23 & targetSdkVersion>23
默认获得普通权限,危险权限需要手动申请
Note:这里说的默认获得所有权限并非真正可靠的权限,根据厂商定制化不同,可能会提示用户手动判断是否同意打开权限,只是通常情况先默认为获取,并且无论用户选择是否同意,用RuntimePermission
的权限判断机制去获取始终返回已经获得该权限。
权限申请API
-
权限常量
所有权限都以静态常量的形式保存在
Manifest.permission
类下,如:文件读取权限Manifest.permission.READ_EXTERNAL_STORAGE
-
检查是否具有某个权限
public static int ContextCompat.checkSelfPermission(Context context, String permission) //返回值为PackageManager.PERMISSION_DENIED 则表示不具备该权限 //返回值为PackageManager.PERMISSION_GRANTED 则表示具备该权限
-
权限请求
public static void ActivityCompat.requestPermissions(Activity activity,String[] permissions, @IntRange(from = 0) int requestCode) //参数依次是 //Activity实例权限数组 //请求码(用于判断请求回调)
-
权限请求结果回调
//需要在Activity中监听,重写对应方法 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) //参数依次是 //请求码 //请求权限数组 //授权结果 同检测权限返回值类型相同
-
检查用户是否禁用权限申请框(即选择了拒绝,并且不在提醒)
public static boolean ActivityCompat.shouldShowRequestPermissionRationale(Activity activity, String permission) //如果被禁用了返回false,可以正常显示为true
-
跳转到应用权限设置界面(通用,不保证个别国产系统)
val intent = Intent() intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.action = "android.settings.APPLICATION_DETAILS_SETTINGS" intent.data = Uri.fromParts("package", packageName, null)
封装
懒得自己动手写的筒子们 这里提供一个自用Kotlin封装好的基于Activity的权限请求框架:6.0权限请求框架