最近一直在做Android运行时权限相关内容,总结一下:
有几个常用接口说明一下:
1. 主要用于检测某个权限是否已经被授予
ContextCompat.checkSelfPermission(context, permission)
看一下源码说明
/**
* Determine whether <em>you</em> have been granted a particular permission.
*
* @param permission The name of the permission being checked.
*
* @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if you have the
* permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} if not.
*
* @see android.content.pm.PackageManager#checkPermission(String, String)
*/
public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
if (permission == null) {
throw new IllegalArgumentException("permission is null");
}
return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
}
返回值有两种:
PackageManager.PERMISSION_DENIED 权限没有被授予
PackageManager.PERMISSION_GRANTED 权限已经授予
- 申请权限
mRequestCode);
看一下源码参数说明
@param activity The target activity.
@param permissions The requested permissions. Must me non-null and not empty.
@param requestCode Application specific request code to match with a result
reported to {@linkOnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}.
Should be >= 0.
第一个参数,context一要为Activity
第二个参数,要请求的权限的数组,一次可以请求多个权限
第三个参数,请求码,请求回调的时候要用到,用来识别是哪一个请求
- 是否应该有解释说明
ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)
针对某一权限,当我们还没有调用申请接口或者允许请求的情况下或者拒绝不再提示,调用该接口返回false。
当我们拒绝某一权限或者在设置里面将该权限设置为不允许后,该接口返回true。
该接口主要用于用户拒绝授予权限的情况下(非拒绝不再提示)向用户说明要申请的权限的作用。
该接口也可用来判断是否用户已经选择拒绝并且不在提示。
- 权限请求后,结果是采用回调的方式返回的
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
我们要重写此方法,在这里我们能获取到我们请求的权限的结果。
第一个参数:我们的请求码,用来判断回调的是否为我们想要处理的请求。
第二个参数:我们请求的权限,是一个数组,因为我们一次可以请求多个权限。
第三个参数:我们请求的权限的结果,长度为我们请求的权限数组的长度,里面的结果为是否授予该权限,值与第二个参数意义对应。
经过实践,授予权限结果为0,没有授予权限结果为-1。