従来の権限リクエスト
Androidでカメラなどの権限リクエストは以下の形式になっていた。
- Fragment#requestPermissions() を呼び出すとダイアログを表示
- 許可・不許可をユーザーが選択する
- 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

修正方法
requestPermissionsによるパーミッションリクエストの仕組みはregisterForActivityResult()で代替された。
registerForActivityResult()を使った実装は以下のようになる。
まずregisterForActivityResult()メソッドでActivityResultLauncherを作成しフィールドに格納する
class FooFragment: Fragment() {
private val permissionRequest = registerForActivityResult(ActivityResultContracts.RequestPermission()) { result ->
// TODO
}
}
作成したActivityResultLauncherのlaunch()メソッドを任意のタイミングで呼び出す。
(例として以下では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を解消できる。

\確かな知識を身に着けたい、Androidアプリ開発を学びたい人にオススメ!/
