什么时候方法会返回ture
shouldShowRequestPermissionRationale方法的作用是什么,从命名上很好理解,就是判断是否需要向用户显示权限说明弹窗。
为了更好理解,先看一段谷歌的示例代码
if (ContextCompat.checkSelfPermission(
CONTEXT, Manifest.permission.REQUESTED_PERMISSION) ==
PackageManager.PERMISSION_GRANTED) {
// You can use the API that requires the permission.
performAction(...);
} else if (shouldShowRequestPermissionRationale(...)) {
// In an educational UI, explain to the user why your app requires this
// permission for a specific feature to behave as expected. In this UI,
// include a "cancel" or "no thanks" button that allows the user to
// continue using your app without granting the permission.
showInContextUI(...);
} else {
// You can directly ask for the permission.
// The registered ActivityResultCallback gets the result of this request.
requestPermissionLauncher.launch(
Manifest.permission.REQUESTED_PERMISSION);
}
运行这段代码,可以分为三种情况
第一阶段
从来未申请过权限,执行了第三个代码块,弹出了系统权限弹框。这时候shouldShowRequestPermissionRationale返回false。
第二阶段
第一阶段弹出权限弹框后,我们选择拒绝授权权限。然后再次运行这段代码,这时候执行了第二个代码块,弹出了我们自定义的权限说明弹窗。这时候shouldShowRequestPermissionRationale返回ture。
第三阶段
前两阶段我们都拒绝了授权权限,再次运行这段代码,这时候执行了第三个代码块。shouldShowRequestPermissionRationale返回false,但是这次并未弹出系统权限弹框。说明系统已经禁止了申请这个权限。
总结
shouldShowRequestPermissionRationale只有在拒绝了第一次后才会返回ture,第二次拒绝返回false
怎么判断权限被禁止了
官方并未提供对应api。结合上面的逻辑的我们可以总结出
if (grantResult == PackageManager.PERMISSION_DENIED
&& !shouldShowRequestPermissionRationale(Manifest.permission_group.STORAGE)){
//权限被禁止了
}
注意,只能在onRequestPermissionsResult里判断。因为第一次未申请过权限shouldShowRequestPermissionRationale返回false,是符合这个判断的。
实际申请权限流程
日常产品定义的需求和谷歌定义的模板有区别:
1.权限说明弹窗在第一次申请前,而不是第二次申请
2.被禁止权限后,会引导用户到设置页手动打开
所以正确的流程:
private void requestPemission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
start();
} else {
if (ContextCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
start();
} else if (isFirstRequst) {
//说明弹窗
showTipDialog();
} else {
//申请权限
requestPermissions(new String[]{Manifest.permission_group.STORAGE}, 123);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 123){
int grantResult = grantResults[0];
if (grantResult == PackageManager.PERMISSION_GRANTED){
start();
} else if (grantResult == PackageManager.PERMISSION_DENIED
&& !shouldShowRequestPermissionRationale(Manifest.permission_group.STORAGE)){
//权限被禁止了,引导用户到设置页
}
}
}
可以看出实际开发中,shouldShowRequestPermissionRationale的作用只是用于判断权限是否被禁止了