1.权限对话框的可见性
此项影响所有的应用,无论targetSDKVersion为多少。
在使用下面方法请求权限时,在Android R版本中可能不会有对话框弹出。
1.1-什么场景下不会显示权限对话框
1.用户已经两次拒绝该权限时
--- 在权限对话框中点击拒绝
在开发者网站中对于其它行为下权限“拒绝”的定义
---如果用户按返回按钮关闭权限对话框,此操作不算“拒绝”操作。
---如果用户使用 requestPermissions() 从您的应用转到系统设置,然后按返回按钮,此操作就算是“拒绝”操作。
注:在设置清理缓存或重新安装后会清零
1.2-请求权限相关方法的说明
//在Android R(11)之前调用此方法总是会调起权限对话框
//在Android R(11)中调用此方法不一定会调起权限对话框,
//在无法调起时会直接回调onRequestPermissionsResult(),grantResult返回值为PERMISSION_DENIED
public static void requestPermissions (Activity activity,
String[] permissions,
int requestCode)
1.3-此行为可能带来的影响
1.不少应用在用户拒绝权限后,会退出应用。此项行为变更会可能会导致,应用直接"闪退"的情况.
因此在适配时需要留意此逻辑带来的影响。
2.需要处理权限对话框无法弹出的情况,增加权限申请说明后跳转到设置中
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "获得权限", Toast.LENGTH_LONG).show();
} else {
//关闭当前界面,在Android R中可能会导致界面"闪退"的情况出现。
//finish();
//在第一次拒绝时,此方法返回true, 二次拒绝之后续返回值都是false。
if (PermissionUtils.shouldShowRequestPermissionRationale(this, permissions[0])) {
new AlertDialog.Builder(this)
.setMessage("应用需要此权限")
.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//跳转到设置当中
PermissionUtils.goToSettings(MainActivity.this);
}
})
.create().show();
} else {
//do sth.
//增加权限说明,并跳转到设置中
}
Toast.makeText(this, "权限被拒绝", Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
//PermissionUtils.java#goToSettings.跳转到设置应用详情的代码
public static void goToSettings(Context context) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
}