ActivityResultContract の仕組みを使って、パーミッションを要求することができます。
前提
AndroidX や AndroidX Fragment が導入されている前提です。
実装
RequestPermission を使います。
class MyFragment: Fragment() {
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (granted) {
// 権限を取得できた
} else {
// 権限を取得できなかった
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = /* ... */
binding.button.setOnClickListener {
requestPermissionLauncher.launch(WRITE_EXTERNAL_STORAGE)
}
}
// ...
解説
launch() の引数にパーミッションの種類を渡し、registerForActivityResult の callback でパーミッション取得結果を受け取ります。
複数のパーミッションを要求する
RequestMultiplePermissions で複数のパーミッションを要求できます。
実装
class MyFragment: Fragment() {
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { granted ->
// granted: Map<String, Boolean>
if (granted[WRITE_EXTERNAL_STORAGE]) {
// WRITE_EXTERNAL_STORAGE の権限を取得できた
}
if (granted[ACCESS_FINE_LOCATION]) {
// ACCESS_FINE_LOCATION の権限を取得できた
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val binding = /* ... */
binding.button.setOnClickListener {
requestPermissionLauncher.launch(
arrayOf(WRITE_EXTERNAL_STORAGE, ACCESS_FINE_LOCATION)
)
}
}
// ...
解説
launch() の引数にパーミッションの配列を渡し、registerForActivityResult の callback でパーミッション取得結果を受け取ります。パーミッション取得結果は Map<String, Boolean>
形式で、それぞれのパーミッションをキーとして結果が保持されています。