Androidのパーミッションダイアログで「今後表示しない」を選択されたかどうかをshouldShowRequestPermissionRationale()を使って、どう判定するかについて書いていきます。
目次
shouldShowRequestPermissionRationale()の挙動
パーミッションダイアログで「今後表示しない」を選択されたかどうかを判定するためには、shouldShowRequestPermissionRationaleを使用して判定をします。
ただ、shouldShowRequestPermissionRationaleというメソッド、名前を見る感じパーミッションを見せるべきかどうかを返してくれるように見えますがちょっと違います。
公式ドキュメントでは 「アプリがパーミッションを既にリクエストしていて、ユーザーがそのパーミッションを拒否した場合、このメソッドは falseを返します。」 とあります。 https://developer.android.com/training/permissions/requesting?hl=ja
要するに、
- 一度も拒否されていない(まだパーミッションダイアログを出していない)ならfalse、
- 1度拒否されて「今後表示しない」が選択されてないならtrue、
- 1度拒否されて「今後表示しない」が選択された場合はfalse
という挙動です。
なので、何も考えずに shouldShowRequestPermissionRationale()がfalseだったらパーミッションダイアログを表示しない という処理にすると初回に表示されないため、一生パーミッションダイアログが表示されないようになってしまいます。
解決方法・実装
そのため、
- 「今後表示しない」が選択されているかを示すPreferenceの値(ここではIS_CHECKED_NOT_ASK_AGAINとする)を用意
- onRequestPermissionsResult() で パーミッションが付与されていないときに shouldShowRequestPermissionRationale() がfalseになったらPreferenceのIS_CHECKED_NOT_ASK_AGAINをtrueにする
という処理にすることで、「今後表示しない」をチェックされたかの判定はPreferenceのIS_CHECKED_NOT_ASK_AGAINを参照すれば、パーミッションダイアログを一度も出していない場合も正しく判定できます。
@Override
public void onCreate() {
if (PreferenceのIS_CHECKED_NOT_ASK_AGAINがfalse) {
パーミッションダイアログ表示
} else {
パーミッションない時の処理
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (パーミッション取得できた) {
パーミッション取得後の処理
} else {
パーミッションが拒否された時の処理
if (!shouldShowRequestPermissionRationale(permissions[0])) {
// 「二度と表示しない」がチェックされた
PreferenceのIS_CHECKED_NOT_ASK_AGAINをtrueにする
}
}
}