によるAndroid の権限ガイドに従って、アプリは実行時の権限を確認し、まだ付与されていない場合は権限を要求できます。ユーザーに権限を要求すると、次のダイアログが表示されます。
ユーザーが許可要求を拒否した場合、アプリは許可が必要な理由と拒否した場合の影響についての説明を表示する必要があると思います。そのダイアログには 2 つのオプションがあります。
- もう一度やり直してください(再度許可が要求されます)
- 拒否します(アプリはその権限なしでも動作します)。
ただし、ユーザーがチェックした場合Never ask again
、特にユーザーが以前に一度拒否した場合は、説明を含む 2 番目のダイアログは表示されません。ここでの疑問は、アプリはどのようにしてユーザーが をチェックしたかを知るのかということです。Never ask again
私が知る限り、このonRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
方法ではその情報は得られません。
2 つ目の質問は、Google は、アプリが許可を必要とする理由を説明するカスタム メッセージを許可ダイアログに組み込む予定があるかどうかです。そうすれば、2 つ目のダイアログは表示されなくなり、ユーザー エクスペリエンスが向上することは間違いありません。
ベストアンサー1
開発者プレビュー2では、アプリによる権限の要求方法にいくつかの変更が加えられています(http://developer.android.com/preview/support.html#preview2-notes)。
最初のダイアログは次のようになります。
「次回から表示しない」チェックボックスはありません (開発者プレビュー 1 とは異なります)。ユーザーが権限を拒否し、権限がアプリにとって不可欠な場合は、アプリがその権限を要求する理由を説明する別のダイアログが表示される場合があります。たとえば、次のようになります。
ユーザーが再度拒否した場合、アプリは、その権限が絶対に必要な場合はシャットダウンするか、機能が制限された状態で実行を継続する必要があります。ユーザーが再考した場合 (再試行を選択した場合)、権限が再度要求されます。今回は、プロンプトは次のようになります。
2 回目は、「今後このメッセージを表示しない」チェックボックスが表示されます。ユーザーが再度拒否し、チェックボックスがオンになっている場合は、それ以上何も起こりません。チェックボックスがオンになっているかどうかは、Activity.shouldShowRequestPermissionRationale(String) を使用して判断できます。例:
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {...
Androidのドキュメントにはこう書いてある(権限):
追加の説明が必要な状況を見つけやすくするために、システムには Activity.shouldShowRequestPermissionRationale(String) メソッドが用意されています。このメソッドは、アプリが以前にこの権限を要求し、ユーザーがその要求を拒否した場合に true を返します。これは、権限が必要な理由をユーザーに説明する必要があることを示しています。
ユーザーが過去に権限要求を拒否し、権限要求システム ダイアログで [今後確認しない] オプションを選択した場合、このメソッドは false を返します。デバイス ポリシーによってアプリがその権限を持つことが禁止されている場合も、このメソッドは false を返します。
ユーザーが「今後は確認しない」で拒否したかどうかを確認するには、ユーザーが権限を付与しなかった場合に、onRequestPermissionsResult のshouldShowRequestPermissionRationaleメソッドを再度確認します。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_PERMISSION) {
// for each permission check if the user granted/denied them
// you may want to group the rationale in a single dialog,
// this is just an example
for (int i = 0, len = permissions.length; i < len; i++) {
String permission = permissions[i];
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
// user rejected the permission
boolean showRationale = shouldShowRequestPermissionRationale( permission );
if (! showRationale) {
// user also CHECKED "never ask again"
// you can either enable some fall back,
// disable features of your app
// or open another dialog explaining
// again the permission and directing to
// the app setting
} else if (Manifest.permission.WRITE_CONTACTS.equals(permission)) {
showRationale(permission, R.string.permission_denied_contacts);
// user did NOT check "never ask again"
// this is a good place to explain the user
// why you need the permission and ask if he wants
// to accept it (the rationale)
} else if ( /* possibly check more permissions...*/ ) {
}
}
}
}
}
次のコードでアプリ設定を開くことができます:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
ユーザーを認証ページに直接送信する方法はありません。