【发布时间】:2017-06-19 16:39:47
【问题描述】:
我正在尝试重构一段处理 Android 权限的代码。它工作正常,除了一个让我很头疼的烦人的 UI 错误。代码如下:
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, 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.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(accessCamera) != PackageManager.PERMISSION_GRANTED) {
showMessageOK(R.string.permdesc_access_camera,
accessCamera);
}
}
它基本上获取用户尚未授予的权限列表,循环访问它们并提示用户授予每个权限。完成后,它会检查尚未授予的任何剩余权限,并再次提示用户有关为什么需要该权限以及不允许该权限的结果的信息,直到他接受或选择“不再询问”。
我的问题出现在 onRequestPermissionResult() 中的链式“if”语句上。您可能会猜到,如果多个权限条件为真,则每个对话框都会在当前现有对话框的下方打开。这会在一个对话框关闭和下一个显示之间产生“跳跃”对话框效果。我已经尝试过 case 和 if/elseif 语句来解决这个问题,但它会导致我的其余权限逻辑出现问题。
有人对此有干净的解决方案吗?我将感激不尽。
【问题讨论】:
-
恕我直言,最干净的解决方案是摆脱所有
showMessageOK()电话。用户知道用户授予了您权限,因为用户只是这样做了。不要感谢他们授予权限——做任何用户要求的需要权限的事情。 -
确保您要求的所有权限也在您的
AndroidManifest文件中声明
标签: java android user-interface permissions