皆さん、権限許可してますか?
今回は、備忘録も兼ねてAndroid 6.0以降で権限許可させるときのちゃんとした実装を紹介します。
まず、今回の実装はこんな感じです。
- 許可ダイアログを出して許可された場合
- 許可ダイアログを出して許可されなかった場合
- 「今後表示しない」設定にされた場合
この3つで分岐させます。
Table of Contents
- ソースコード
- 2020/10/12追記:Android 11以降の仕様について
ソースコード
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE) {
if (grantResults.all { it == PERMISSION_GRANTED }) {
// 許可された
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, 権限)) {
// 許可されなかった
} else {
// 「今後表示しない」にチェックを入れられた
}
}
}
}
shouldShowRequestPermissionRationale()
メソッドは、本来「今後表示しない」をチェックするメソッドではないので、直接「今後表示しない」にチェックが入ったかを返すわけではありません。実際は以下のように値を返します。
- 表示回数0回→false
- 表示回数1回以降→true
- 表示回数2回以降、「今後表示しない」にチェックが入った場合→false
そのため、onRequestPermissionsResult()
にこのメソッドを置くことで、まだ1回も表示していない場合のfalseを回避できます。こういう仕組みで判別しています。
つまりは、権限が許可されていない場合は問答無用でrequestPermission()
を呼びます。そうすると、「今後表示しない」にチェックが入っていた場合でもonRequestPermissionResultメソッドで拒否されたものとして結果が返ってきます。
2020/10/12追記:Android 11以降の仕様について
Androd 11以降では、2回目に「許可しない」をタップした場合は問答無用で「今後表示しない」にチェックを入れたものとして扱われ、3回目以降は表示されなくなります。(だからといってロジックを変更させる必要は特にありません。)