diadia

興味があることをやってみる。自分のメモを残しておきます。

Android "パーミッションの解除" について

パーミッションの種類

Androidではパーミッションは2種類存在する。 Normalパーミッション、Dangerousパーミッションに区別される。

Dengerousパーミッションのリスト

  1. CALENDAR
  2. CAMERA
  3. CONTACTS
  4. LOCATION
  5. MICROPHONE
  6. PHONE

パーミッションリストを示す資料

システム パーミッション  |  Android デベロッパー  |  Android Developers

Dengerousパーミッションの取り扱い

1.パーミッション取得状況の確認方法

アプリに dangerous パーミッションが必要な場合は、dangerous パーミッションが必要な操作を実行するたびにパーミッションの有無を確認する必要があり、その確認はContextCompat.checkSelfPermission()メソッドを使う。

    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
            != PackageManager.PERMISSION_GRANTED) {
        // Permission is not granted
    }

この他にも以下のように使っても良い。

fun isAllPermissionsGranted(REQUIRED_PERMISSIONS: Array<String>) = REQUIRED_PERMISSIONS.all {
    ContextCompat.checkSelfPermission(
        MyApplication.appContext, it) == PackageManager.PERMISSION_GRANTED
}

checkSelfPermissionメソッドのドキュメント

ContextCompat  |  Android デベロッパー  |  Android Developers

2. パーミッションを得る

ActivityCompat#requestPermissions()を使ってユーザーに対してパーミッションをリクエストする。 このメソッドを実行すると自動的にユーザーに対してパーミッションの許可を得るダイアログが表示される。このダイアログでパーミッションの許可をするとdangerousパーミッションに該当する機能を実行する事ができる。
当然ながら許可をしないと機能を実行する事ができない。 dangerousパーミッションに該当するものを起動する毎にパーミッションの許可状況を取得し、許可がなければrequestPermissions()が実行される流れとなる(このような流れでコーディングを行う)。

しかしながらActivityCompat#requestPermissions()で表示されるダイアログにdon't ask again というチェックボックスが存在しており、このチェックボックスをチェックしてパーミッションを拒否するアクションをユーザーがとることができる。 このアクションをユーザーに取られてしまうとActivityCompat#requestPermissions()を再度実行したときでも許可を得るダイアログが表示されなくなってしまう。この状態でパーミッションを得るためのコードを追加する必要が出てきてしまう。

3. don't ask againで拒否されてしまった場合でもパーミッションを得る

ActivityCompat#requestPermissions()で表示されるダイアログにdon't ask again のチェックボックスにチェックしてパーミッションを拒否された場合には、自らダイアログを作成し、そこでrequestPermission()を実行する。 上記の状況はActivityCompat.shouldShowRequestPermissionRationale()を使ってBoolean型でその状況か否かを取得することができる。 Dont’ ask againを選択した場合にはfalseが返り、過去にdenyだけした場合にはtrueが返る。

現状のパーミッション状況のチェック パーミッションがある -> そのまま実行
パーミッションがない ->リクエスパーミッションかダイアログを開くかの選択をしなければならない。 trueがある場合はリクエスパーミッション

資料

https://blog.usejournal.com/method-to-detect-if-user-has-selected-dont-ask-again-while-requesting-for-permission-921b95ded536

4. requestPermissionsの結果はonRequestPermissionsResultで受け取る

onRequestPermissionsResultはユーザーがパーミッションの許可選択をしたあとに実行されるコールバックである。このコールバック内で再度パーミッションの許可状態を取得し、許可状態であれば実行したい機能を起動させる。そうでなければパーミッションの関係により実行できなかったなど表示させれば良いだろう。

5. ActivityとFragmentでパーミッションの取り扱いが異なっている

ActivityとFragmentでパーミッションの扱いが異なる点が存在するので注意しなければならない。 ActivityとFragmentの共通点はパーミッションの許可状況の取得(ContextCompat.checkSelfPermission())とdon't ask againで拒否されてしまったいるかどうかの状況取得(ActivityCompat.shouldShowRequestPermissionRationale())である。
またActivityとFragmentのonRequestPermissionsResult()も共通しているが注意が必要である。onRequestPermissionsResult()がコールバックされる状況はrequestPermissions()メソッドによって変わる点である。両者は厳密には別のメソッドである。 FragmentActivity#onRequestPermissionsResultまたはComponentActivity#onRequestPermissionsResultがActivityのものであり、Fragment#onRequestPermissionsResultがFragmentのものである。

ActivityCompat#requestPermissions()を使うとActivityのonRequestPermissionsResultが呼び出される。Fragment#requestPermissionsを使うとFragmentのonRequestPermissionsResultが呼び出される。また引数も両者で違いがあるので注意が必要である。

パーミッション関連のメソッド整理

メソッド名 役割 該当ドキュメント
ContextCompat#checkSelfPermission() パーミッションがあるかどうかを確認する ContextCompat  |  Android デベロッパー  |  Android Developers
ActivityCompat#requestPermissions() パーミッションをユーザーに要求する ActivityCompat  |  Android デベロッパー  |  Android Developers

関連資料

どのようにパーミッションを得るか説明した資料

アプリの権限をリクエストする  |  Android デベロッパー  |  Android Developers

hoge

システム パーミッション  |  Android デベロッパー  |  Android Developers