본문 바로가기

안드로이드 개발

Android Compose에서 퍼미션 요청하기

반응형

Jetpack Compose를 활용한 안드로이드 앱 개발이 점점 보편화되고 있습니다. 기존 View 기반의 권한(Permission) 요청 방식과 달리, Compose에서는 권한 요청을 좀 더 선언적이고 간결하게 구현할 수 있습니다. 이 글에서는 Compose에서 퍼미션을 요청하는 대표적인 방법과 실전 예제를 소개합니다.

1. 권한 요청을 위한 라이브러리 준비

Compose에서 권한 요청을 간단하게 처리하려면 Google의 Accompanist Permissions 라이브러리를 사용하는 것이 일반적입니다.
아래와 같이 build.gradle에 의존성을 추가하세요.

implementation("com.google.accompanist:accompanist-permissions:<version>")

<version>에는 최신 버전을 입력합니다[1][4].

2. 퍼미션 요청 기본 구조

Accompanist의 rememberPermissionState 함수를 사용하면 퍼미션 상태를 쉽게 관리할 수 있습니다.
예시로 카메라 권한을 요청하는 Compose 코드는 다음과 같습니다.

@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun RequestCameraPermission() {
    val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)

    if (cameraPermissionState.status.isGranted) {
        Text("카메라 권한이 허용되었습니다.")
    } else {
        Column {
            val rationale = if (cameraPermissionState.status.shouldShowRationale) {
                "카메라 권한은 필수입니다. 권한을 허용해주세요."
            } else {
                "카메라 권한이 필요합니다."
            }
            Text(rationale)
            Button(onClick = { cameraPermissionState.launchPermissionRequest() }) {
                Text("권한 요청")
            }
        }
    }
}
  • shouldShowRationale는 사용자가 권한을 거부했을 때 안내 메시지를 보여줄지 결정하는 데 사용합니다.
  • 권한 요청은 반드시 버튼 등 사용자 액션에서 호출해야 하며, Composable이 아닌 범위에서는 호출할 수 없습니다[1][4].

3. 여러 권한 동시 요청

여러 권한을 한 번에 요청하려면 rememberMultiplePermissionsState를 사용합니다.

val permissionsState = rememberMultiplePermissionsState(
    listOf(
        Manifest.permission.CAMERA,
        Manifest.permission.READ_EXTERNAL_STORAGE
    )
)

이후 각 권한의 상태를 개별적으로 확인할 수 있습니다[1].

4. ActivityResultContracts를 활용한 권한 요청

Accompanist를 사용하지 않고, Jetpack Compose의 기본 API만으로도 권한 요청이 가능합니다.
rememberLauncherForActivityResultActivityResultContracts.RequestPermission()을 활용하는 방식입니다.

@Composable
fun RequestPermissionExample() {
    val context = LocalContext.current
    val launcher = rememberLauncherForActivityResult(
        ActivityResultContracts.RequestPermission()
    ) { isGranted ->
        // 권한 허용/거부 결과 처리
    }

    Button(onClick = {
        launcher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
    }) {
        Text("권한 요청")
    }
}

이 방식은 별도 라이브러리 없이 Compose만으로 구현할 수 있다는 장점이 있습니다[2][4].

5. 권한 요청 시 주의사항

  • AndroidManifest.xml에 반드시 필요한 권한을 선언해야 합니다.
  • 권한 요청 API는 실험적(Experimental)인 경우가 많으므로, 향후 변경될 수 있습니다.
  • 사용자가 권한을 거부했을 때 적절한 안내 메시지를 제공하는 것이 중요합니다[1][4].

6. 샘플 프로젝트 및 참고 자료

실제 Compose 기반 권한 요청 예제와 샘플 프로젝트는 아래에서 확인할 수 있습니다.


Jetpack Compose에서는 선언적 UI의 장점을 살려 퍼미션 요청도 훨씬 간단하고 직관적으로 구현할 수 있습니다.
Accompanist와 Compose의 ActivityResult API를 적절히 활용해, 사용자 경험을 해치지 않는 권한 요청 플로우를 설계해보세요.


참고:

  • [1]: dongtrivia.com/entry/Android-JetPack-Compose-에서-permission-요청하기
  • [2]: billcorea.tistory.com/618
  • [3]: github.com/parade621/ComposePermissionSample
  • [4]: stackoverflow.com/questions/60608101/how-request-permissions-with-jetpack-compose

출처
[1] [Android] JetPack Compose 에서 permission 요청하기 https://dongtrivia.com/entry/Android-JetPack-Compose-%EC%97%90%EC%84%9C-permission-%EC%9A%94%EC%B2%AD%ED%95%98%EA%B8%B0
[2] Jetpack Compose에서 알림 권한 요청과 알림 표시하기 https://billcorea.tistory.com/618
[3] Jetpack Compose permission request sample - GitHub https://github.com/parade621/ComposePermissionSample
[4] How request permissions with Jetpack Compose? - Stack Overflow https://stackoverflow.com/questions/60608101/how-request-permissions-with-jetpack-compose
[5] [Android]Jetpack Compose & Accompanist Permissions를 활용한 ... https://velog.io/@jun34723/Jetpack-Compose-Accompanist-Permissions%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EA%B6%8C%ED%95%9C-%EC%9A%94%EC%B2%AD-%ED%94%8C%EB%A1%9C%EC%9A%B0
[6] [Android] Jetpack Compose 에서 권한 체크, 요청하기 - 경험의 기록 https://hanyeop.tistory.com/452
[7] Jetpack Compose 멀티 Permission 권한 요청 https://velog.io/@nohjunh/Compose-%EB%A9%80%ED%8B%B0-Permission-%EA%B6%8C%ED%95%9C-%EC%9A%94%EC%B2%AD
[8] 런타임 권한 요청 | Privacy - Android Developers https://developer.android.com/training/permissions/requesting
[9] [compose] preview에서 권한(Permission) 요청 코드 작성하기 https://srandroid.tistory.com/648
[10] [Android] 권한 요청 예제 - velog https://velog.io/@dlwngud/Android-%EA%B6%8C%ED%95%9C-%EC%9A%94%EC%B2%AD-%EC%98%88%EC%A0%9C

반응형