Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

개발일기 #9 : 실시간 카메라 권한 획득 방법 Jetpack Compose

Billcorea 2022. 11. 2. 09:34
반응형

CAMERA Permission

앱에서 카메라 권한을 획득해야 하는 경우가 종종 발생합니다. 예전에는 앱이 시작되는 시점에 모든 권한을 획득하고 시작을 했지만, 요즘은 실제 행위가 발생하는 시점에 권한 획득을 하도록 유도하고 있습니다. 

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

항상 그렇지만, manifest 파일에는 위와 같은 권한을 선언해 둡니다.  그래야 다음 동작을 구현할 때 오류가 발생하지 않습니다.  다음은 gradle 파일에 권한 획득을 위한 라이브러리를 가져올 수 있도록 구현합니다. 

dependencies {

    .....

    // 권한 획득
    implementation "com.google.accompanist:accompanist-permissions:0.27.0"
    
    .....
    
}

이제 구현된 코드를 보도록 하겠습니다. 

@OptIn(ExperimentalPermissionsApi::class)
@Composable
private fun FeatureThatRequiresCameraPermission(
    doResult:(ty:Boolean) -> Unit
) {

    // Camera permission state
    val cameraPermissionState = rememberPermissionState(
        Manifest.permission.CAMERA
    )

    when (cameraPermissionState.status) {
        // If the camera permission is granted, then show screen with the feature enabled
        PermissionStatus.Granted -> {
            doResult(true)
        }
        is PermissionStatus.Denied -> {
            Column(
                modifier = Modifier.padding(3.dp),
                horizontalAlignment = Alignment.End
            ) {
                val textToShow = if ((cameraPermissionState.status as PermissionStatus.Denied).shouldShowRationale) {
                    // If the user has denied the permission but the rationale can be shown,
                    // then gently explain why the app requires this permission
                    stringResource(id = R.string.msgGetPermissonCamera)
                } else {
                    // If it's the first time the user lands on this feature, or the user
                    // doesn't want to be asked again for this permission, explain that the
                    // permission is required
                    stringResource(id = R.string.msgGetPermissonCamera)
                }
                IconButton(onClick = {

                    cameraPermissionState.launchPermissionRequest()
                    doResult(false)

                }) {
                    Icon(
                        imageVector = Icons.Outlined.PermCameraMic,
                        contentDescription = "Grant a Camera",
                        tint = softBlue
                    )
                }
                Text(textToShow)
            }
        }
    }
}

doResult() 함수의 경우는 다른 화면 구성에서 호출 했을 때 권한 획득 여부를 return을 해 주면 해당 위치에서 다른 기능을 구현할 수 있게 됩니다.  그것을 이용하기 위해서 처리한 부분입니다. 

 

이제 구현된 화면이 구동 모습을 보도록 하겠습니다. 

권한 획득 흐름

이렇게 하면 앱이 구동중에 권한이 필요한 경우 메시지를 보여 주고 해당 권한을 획득한 후 필요한 동작을 구현해 볼 수 있습니다. 

 

이 포스팅은 아래 링크의 내용을 참조 하였음을 밝혀 둡니다.

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

 

Guide - Accompanist

Jetpack Compose Permissions A library which provides Android runtime permissions support for Jetpack Compose. Warning The permission APIs are currently experimental and they could change at any time. All of the APIs are marked with the @ExperimentalPermiss

google.github.io

 

반응형