2021年6月21日月曜日

Jetpack Compose で Runtime Permission をリクエストする

onStart() でパーミッションがあるかどうかチェックして、無い場合はパーミッションをリクエストする処理です。

rememberLauncherForActivityResult() を使います。
  1. enum class PermissionState {  
  2.     Checking,  
  3.     Granted,  
  4.     Denied,  
  5. }  
  6.   
  7. @Composable  
  8. private fun NeedPermissionScreen() {  
  9.     var state by remember { mutableStateOf(PermissionState.Checking) }  
  10.   
  11.     val launcher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) {  
  12.         state = if (it) PermissionState.Granted else PermissionState.Denied  
  13.     }  
  14.   
  15.     val permission = Manifest.permission.CAMERA  
  16.   
  17.     val context = LocalContext.current  
  18.     val lifecycleObserver = remember {  
  19.         LifecycleEventObserver { _, event ->  
  20.             if (event == Lifecycle.Event.ON_START) {  
  21.                 val result = context.checkSelfPermission(permission)  
  22.                 if (result != PackageManager.PERMISSION_GRANTED) {  
  23.                     state = PermissionState.Checking  
  24.                     launcher.launch(permission)  
  25.                 } else {  
  26.                     state = PermissionState.Granted  
  27.                 }  
  28.             }  
  29.         }  
  30.     }  
  31.     val lifecycle = LocalLifecycleOwner.current.lifecycle  
  32.     DisposableEffect(lifecycle, lifecycleObserver) {  
  33.         lifecycle.addObserver(lifecycleObserver)  
  34.         onDispose {  
  35.             lifecycle.removeObserver(lifecycleObserver)  
  36.         }  
  37.     }  
  38.   
  39.     when (state) {  
  40.         PermissionState.Checking -> {  
  41.         }  
  42.         PermissionState.Granted -> {  
  43.             // TODO パーミッションが必要な機能を使う画面  
  44.         }  
  45.         PermissionState.Denied -> {  
  46.             // TODO 拒否された時の画面  
  47.         }  
  48.     }  
  49. }  


追記:
Accompanist に最近 Permission のやつが追加されました (現状 Permission 関係のすべての機能は experimental)

https://google.github.io/accompanist/permissions/

0 件のコメント:

コメントを投稿