Ich versuche, ein Stück Code, die Android-Berechtigungen behandelt refaktorieren. Es funktioniert gut, bis auf einen nervigen UI-Bug, der mir viele Kopfschmerzen bereitet hat. Hier ist der Code:Android-Berechtigungen UI-Problem mit mehreren Dialogen
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);
}
}
Es im Grunde eine Liste von Berechtigungen erhält, die vom Benutzer nicht bereits gewährt wird, durchläuft sie und fordert den Benutzer jeweils zu gewähren. Sobald es fertig ist, überprüft es alle verbleibenden Berechtigungen, die nicht gewährt wurden, und fordert den Benutzer erneut mit Informationen darüber auf, warum diese Berechtigung erforderlich ist und das Ergebnis nicht zulässt, bis er entweder "nicht erneut fragen" annimmt oder wählt.
Mein Problem tritt mit den verketteten "if" -Anweisungen in onRequestPermissionResult(). Wie Sie vielleicht vermuten, wenn mehrere Berechtigungsbedingungen wahr sind, dann öffnet jeder Dialog unter den aktuellen vorhandenen Dialog. Dies führt zu einem "Sprung" -Dialogeffekt zwischen dem Schließen eines Dialogs und dem nächsten Anzeigen. Ich habe case und if/elseif versucht, dies zu bekämpfen, aber es verursacht Probleme mit dem Rest meiner Berechtigungslogik.
Hat jemand eine saubere Lösung dafür? Ich wäre dankbar.
IMHO, die sauberste Lösung ist aller 'showMessageOK()' Anrufe loszuwerden. Der Benutzer weiß, dass der Benutzer Ihnen die Berechtigung erteilt hat, weil * der Benutzer es gerade getan hat *. Danken Sie ihnen nicht für die Erteilung der Erlaubnis - tun Sie alles, was der Benutzer verlangte, dass die Erlaubnis benötigt. – CommonsWare
Stellen Sie sicher, dass alle angeforderten Berechtigungen auch in Ihrer 'AndroidManifest'-Datei deklariert sind – Benny