여러개의 권한을 추가 하려 한다. jetpack compose 에서는 권한에 대한걸 다루는게 어색할 수 있지만, 다음 내용을 잘 따라하면 문제 없다.
프로세스
1.
권한을 허용 하거나 거부 했는지 확인한다.
2.
1번을 한 번도 수행하지 않았을 경우, 필요한 권한에 대한 안내 팝업을 표시하고 확인 버튼을 눌렀을 때 사용자에게 권한을 받아온다.
implementation 추가
implementation 'com.google.accompanist:accompanist-permissions:0.24.7-alpha'
Kotlin
복사
필요한 권한 정의
Manifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
XML
복사
permissionList
val MY_PERMISSION_LIST = listOf(
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECEIVE_SMS
)
Kotlin
복사
사용 모습(Top-down)
HomeScreen
@Composable
fun HomeScreen(viewModel: HomeViewModel = hiltViewModel()) {
CheckPermission()
}
Kotlin
복사
HomeScreen에 CheckPermission이란 함수를 만들어 권한 체크와 권한 허용에 대한 로직을 수행할 예정이다.
CheckPermission()
@Composable
fun CheckPermission() {
val permission = getPermissionState()
logC("permission.allPermissionsGranted ${permission.allPermissionsGranted}")
if(permission.allPermissionsGranted.not() && prefs.getSharedPrefBool(PrefKey.PREF_KEY_APP_PERMISSION_CHECK).not()){
PermissionDialog(onDismissRequest = {
logC("PermissionDialog onDismissRequest")
permission.launchMultiplePermissionRequest()
})
}
}
Kotlin
복사
permission이 전부 false로 되어 있고, sharedPreference에 권한에 대한 허용이나 거부를 처리 했다는 값이 없다면 PermissionDialog 팝업을 표시한다. 이 팝업에서 “확인” 버튼을 눌렀을 경우, “permission.launchMultiplePermissionRequest()”를 통해 사용자에게 권한을 받아 온다.
getPermissionState()
@Composable
fun getPermissionState(): MultiplePermissionsState {
val multiplePermissionsState =
rememberMultiplePermissionsState(permissions = MY_PERMISSION_LIST) {
logC("rememberMultiplePermissionsState
}
return multiplePermissionsState
}
Kotlin
복사
저 위에서 필요한 권한을 모아 놨던 List(MY_PERMISSION_LIST)를 이용해 가져오자.
여기 까지 성공 했다면, 앞으로 Jetpack Compose에서 권한 처리 하는데 어려움은 없을 것이다.