我想重構一段代碼,處理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