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만으로도 권한 요청이 가능합니다.rememberLauncherForActivityResult
와 ActivityResultContracts.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 기반 권한 요청 예제와 샘플 프로젝트는 아래에서 확인할 수 있습니다.
- ComposePermissionSample GitHub[3]
- [Accompanist Permissions 공식 문서][1]
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
'안드로이드 개발' 카테고리의 다른 글
Android 16 라이브 업데이트 (0) | 2025.06.06 |
---|---|
Edge-to-Edge Android SDK 35 마이그레이션 가이드 (0) | 2025.06.04 |
Android 개발에서 Edge-to-Edge란? (0) | 2025.06.04 |