【備忘録】Android 権限許可時のちゃんとした実装

2020/04/12 00:00公開

皆さん、権限許可してますか?

今回は、備忘録も兼ねてAndroid 6.0以降で権限許可させるときのちゃんとした実装を紹介します。

まず、今回の実装はこんな感じです。

  • 許可ダイアログを出して許可された場合
  • 許可ダイアログを出して許可されなかった場合
  • 「今後表示しない」設定にされた場合

この3つで分岐させます。

Table of Contents
  1. ソースコード
  2. 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回目以降は表示されなくなります。(だからといってロジックを変更させる必要は特にありません。)