従来の権限リクエスト
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アプリ開発を学びたい人にオススメ!/