Activity.shouldShowRequestPermissionRationale

最初にcheckSelfPermissionで未許可状態で、requestPermissionsで許可ダイアログを表示して、許可しないを選択し、2度目のcheckSelfPermissionの後に、shouldShowRequestPermissionRationaleを呼ぶ書き方になっていることが多いと思う。
Activity.shouldShowRequestPermissionRationaleは、リクエストの根拠を示すべきかどうかを判定するメソッドで、ここでtrueの場合、なぜ指定の権限の許可が必要なのかということを説明することをどうも推奨してるらしい。

Activity  |  Android Developers
いまさら Android 6.0 の Permissions at Run Time について - なるようになるかも

初回はfalseになるのだが、2回目のリクエスト以降はtrueとなり、リクエスト根拠の説明を要求されている。
「今後表示しない」にチェックを付けた場合は、またfalseになる。
AndroidManifest.xmlで、

一応3つのパーミッションを書いておく。
strings.xmlで、

Button1を定義。
activity_main.xmlで、

ここは、LinearLayoutとButtonにした。
MainActivity.javaで、

実際にはACCESS_FINE_LOCATIONだけ扱う。
未許可の場合で、shouldShowRequestPermissionRationaleのACCESS_FINE_LOCATIONがtrueの場合は、"shouldShowRequestPermissionRationale"とトースト表示しておく。
そうでない場合は、"permissionList.add ACCESS_FINE_LOCATION"をトースト表示。
今回はどちらにせよpermissionListの追加、mAccessFineLocationのfalseはやるんだけどね。

起動時
起動時

起動時。
Button1を押すと、

初回はpermissionListにACCESS_FINE_LOCATIONを追加してリクエスト
初回はpermissionListにACCESS_FINE_LOCATIONを追加してリクエス

初回はpermissionListにACCESS_FINE_LOCATIONを追加してリクエスト。
拒否すると、

これで
これで

これで、

こうなる
こうなる

こうなる。
次にButton1を押した場合2回目なので、

shouldShowRequestPermissionRationaleはtrue
shouldShowRequestPermissionRationaleはtrue

shouldShowRequestPermissionRationaleはtrue。
ここでも拒否してみると、

こうなる
こうなる

次も、

true
true

true。
ここで、

今後は確認しないをチェックして許可しないとする
今後は確認しないをチェックして許可しないとする

今後は確認しないをチェックして許可しないとする。
すると、

当然こうなる
当然こうなる

当然こうなる。
で、Button1をまた押すと、

shouldShowRequestPermissionRationaleはfalseでpermissionListに追加される
shouldShowRequestPermissionRationaleはfalseでpermissionListに追加される

shouldShowRequestPermissionRationaleはfalseでpermissionListに追加される。

しかし、確認ダイアログは出ないので、自動で拒否となる。
しかし、確認ダイアログは出ないので、自動で拒否となる。

しかし、確認ダイアログは出ないので、自動で拒否となる。
今回、”shouldShowRequestPermissionRationale”をトースト表示している部分に、本来は「この権限は〇〇という理由で必要」みたいな説明の表示が要る。

Sample/android/Activity/shouldShowRequestPermissionRationale/Activity_ at master · bg1bgst333/Sample · GitHub