従来の権限リクエスト

Androidでカメラなどの権限リクエストは以下の形式になっていた。

  1. Fragment#requestPermissions() を呼び出すとダイアログを表示
  2. 許可・不許可をユーザーが選択する
  3. Framgment#onRequestPermissionsResult() がコールバックで呼ばれる

コードでは以下のように実装する。

class FooFragment: Fragment() {
    companion object {
        private const val REQUEST_CAMERA_PERMISSION = 1
    }

    override fun onViewCreated(...) {
        // ...

        // ① パーミッションをリクエスト→ダイアログが出る
        requestPermissions(arrayOf(android.Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION)

        // ...
    }

    // コールバック
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        // ② パーミッションリクエストが成功した時、しなかったときの処理
    }

}

上記コードでは①のrequestPermissionsの呼び出しで以下のdeprecated warningが発生する。

'requestPermissions(Array<(out) String!>, Int): Unit' is deprecated. Deprecated in Java

deprecated warning

修正方法

requestPermissionsによるパーミッションリクエストの仕組みはregisterForActivityResult()で代替された。

registerForActivityResult()を使った実装は以下のようになる。

まずregisterForActivityResult()メソッドでActivityResultLauncherを作成しフィールドに格納する

class FooFragment: Fragment() {
    private val permissionRequest = registerForActivityResult(ActivityResultContracts.RequestPermission()) { result ->
        // TODO
    }
}

作成したActivityResultLauncherlaunch()メソッドを任意のタイミングで呼び出す。
(例として以下ではonViewCreatedで呼び出している。)

class FooFragment: Fragment() {
    private val permissionRequest = registerForActivityResult(ActivityResultContracts.RequestPermission()) { result ->
        // TODO
    }

    override fun onViewCreated(...) {
        // ...

        // ① パーミッションをリクエスト→ダイアログが出る
        permissionRequest.launch(android.Manifest.permission.CAMERA)

        // ...
    }
}

permissionRequest.launch()を実行するとダイアログが表示される。
ユーザーが許可・不許可を選択するとregisterForActivityResultの第2引数で指定したコールバックが呼ばれる。

class FooFragment: Fragment() {
    private val permissionRequest = registerForActivityResult(ActivityResultContracts.RequestPermission()) { result ->
        // ② パーミッションリクエストが成功した時、しなかったときの処理
    }

    override fun onViewCreated(...) {
        // ...

        // ① パーミッションをリクエスト→ダイアログが出る
        permissionRequest.launch(android.Manifest.permission.CAMERA)

        // ...
    }
}

以上でrequestPermissionsのdeprecated warningを解消できる。

migration