From 573c9554e951e3ae9a3b8798752f79863ac56892 Mon Sep 17 00:00:00 2001 From: Sadturtleman Date: Tue, 3 Nov 2026 00:28:21 +0900 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=EC=B9=B4=EB=A9=94=EB=9D=BC=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EC=A0=84=EC=97=90=20CAMERA=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=EC=9D=84=20=ED=99=95=EC=9D=B8=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 앱이 CAMERA 를 선언한 상태에서 권한 없이 TakePicture 를 띄우면 SecurityException 이 난다. 권한이 없으면 먼저 요청하고, 허용됐을 때만 카메라를 띄운다. 거부하면 아무것도 하지 않는다. Co-Authored-By: Claude Opus 5.5 --- .../kotlin/com/ruleup/ui/image/ImagePicker.kt | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/core/ui/src/main/kotlin/com/ruleup/ui/image/ImagePicker.kt b/core/ui/src/main/kotlin/com/ruleup/ui/image/ImagePicker.kt index c56dd2dca..4df76e006 100644 --- a/core/ui/src/main/kotlin/com/ruleup/ui/image/ImagePicker.kt +++ b/core/ui/src/main/kotlin/com/ruleup/ui/image/ImagePicker.kt @@ -1,6 +1,8 @@ package com.ruleup.ui.image +import android.Manifest import android.content.Context +import android.content.pm.PackageManager import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.PickVisualMediaRequest @@ -12,6 +14,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalInspectionMode +import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import java.io.File @@ -41,11 +44,24 @@ fun rememberImagePicker(onImagePicked: (String) -> Unit): ImagePicker { if (success && uri != null) onImagePicked(uri) } + fun takePicture() { + val uri = createCameraImageUri(context) + cameraImageUri = uri.toString() + camera.launch(uri) + } + + // 앱이 CAMERA 를 선언해 두었으므로, 허용 전에 카메라 앱을 띄우면 SecurityException 이 난다. + val cameraPermission = + rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + if (granted) takePicture() + } + return object : ImagePicker { override fun launchCamera() { - val uri = createCameraImageUri(context) - cameraImageUri = uri.toString() - camera.launch(uri) + val granted = + ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == + PackageManager.PERMISSION_GRANTED + if (granted) takePicture() else cameraPermission.launch(Manifest.permission.CAMERA) } override fun launchGallery() {