我想重构一段代码,处理Android权限。它工作正常,除了一个令人讨厌的UI bug导致我很多头痛。下面的代码:Android权限用户界面问题与多个对话框
private void getPermissions() {
if (Build.VERSION.SDK_INT >= 23) {
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, android.Manifest.permission.ACCESS_COARSE_LOCATION))
permissionsNeeded.add(accessLocation);
if (!addPermission(permissionsList, android.Manifest.permission.READ_CONTACTS))
permissionsNeeded.add(readContacts);
if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE))
permissionsNeeded.add(readStorage);
if (!addPermission(permissionsList, Manifest.permission.CAMERA))
permissionsNeeded.add(accessCamera);
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
}
}
}
private void showMessageOK (int message, final String perm) {
if (shouldShowRequestPermissionRationale(perm)) {
new AlertDialog.Builder(CreateSessionActivity.this)
.setMessage(message)
.setTitle("Permission required")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
requestPermissions(new String[] {perm},
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
})
.create()
.show();
}
}
private boolean addPermission(List<String> permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
//check for rationale
if (!shouldShowRequestPermissionRationale(permission))
return false;
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Map<String, Integer> perms = new HashMap<>();
perms.put(android.Manifest.permission.ACCESS_COARSE_LOCATION, PackageManager.PERMISSION_GRANTED);
perms.put(android.Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED);
perms.put(android.Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
perms.put(android.Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
// Fill with results
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
if (perms.get(accessLocation) != PackageManager.PERMISSION_GRANTED) {
showMessageOK(R.string.permdesc_access_location,
accessLocation);
}
if (perms.get(readContacts) != PackageManager.PERMISSION_GRANTED) {
showMessageOK(R.string.permdesc_read_contacts,
readContacts);
}
if (perms.get(readStorage) != PackageManager.PERMISSION_GRANTED) {
showMessageOK(R.string.permdesc_read_storage,
readStorage);
}
if (perms.get(accessCamera) != PackageManager.PERMISSION_GRANTED) {
showMessageOK(R.string.permdesc_access_camera,
accessCamera);
}
}
它基本上获得通过他们,是不是已经被用户授予的权限,周期的列表,并提示用户授予每个。一旦完成,它会检查尚未授予的任何剩余权限,并再次提示用户有关为什么需要该权限以及不允许该权限的结果的信息,直到他接受或选择“不再请求”为止。
我的问题与onRequestPermissionResult()中的链接“if”语句发生。您可能会猜到,如果多个权限条件为真,那么每个对话框将打开下面的当前现有的对话框。这导致一个对话框关闭和下一个显示之间的“跳跃”对话效果。我已经尝试过case和if/elseif语句来解决这个问题,但是这会导致我的其他许可权逻辑出现问题。
有没有人有这个清洁的解决方案?我会很感激。
恕我直言,最干净的解决方案是摆脱所有的'showMessageOK()'调用。用户知道用户授予您权限,因为*用户只是做了*。不要感谢他们授予权限 - 无论用户要求什么,都需要获得许可。 – CommonsWare
确保您要求的所有权限也在您的“AndroidManifest”文件中声明 – Benny