Androidのアクセス権を扱うコードをリファクタリングしようとしています。それは私が頭痛の多くを引き起こしている1つの面倒なUIのバグを除いて、うまく動作します。それは基本的にそれらを介してユーザによって既に付与されていない権限、サイクルのリストを取得し、それぞれを付与するようにユーザーに促し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, 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文で発生します。あなたが推測しているように、複数の許可条件が満たされている場合は、それぞれのダイアログでの下にが開きます。これにより、1つのダイアログクローズと次の表示との間に「ジャンプ」ダイアログ効果が生じます。私は、これと戦うためにcaseとif/elseif文を試しましたが、残りの許可ロジックに問題が生じます。
誰もがこれに対してクリーンな解決策を持っていますか?私は感謝されます。
私見を、クリーンなソリューションは、すべての 'showMessageOK()'の呼び出しを取り除くことです。ユーザーはあなたが許可したことを知っています。許可を与えたことに感謝しないでください。許可が必要なものをユーザーが要求したものであれば何でもしてください。 – CommonsWare
あなたが 'AndroidManifest'ファイルでも宣言しているすべてのアクセス権を確認してください – Benny