앱을 만들다가 이미지 활용을 위한 방법을 찾아보는 기회가 생겼다. 며칠간의 고민 끝에 방법이 정리가 되어 간다.
먼저 카메라에서 이미지 가져오기는 다음 링크를 참고 했음을 밝힌다.
다만, 가이드에서 말하는 cameraX을 활용하고 싶지는 않고, 기본 카메라 앱을 호출해서 촬영하고 그 결과 이미지만 받아오는 형태로 만들어 보고 싶었다. 그래서 이런저런 내용을 찾아보다가 저 글을 찾게 된 것이다. 감사하게도
결과를 이용하는 방식은 아래 코드와 같다. 다름이 있다면, 갤러리에서 이미지를 가져오는 형식은 uri 가 결과가 오고, 카메라의 결과는 bitmap으로 온다는 차이만 있음 다름이다.
// 갤러리에서 사진 가져오기
val launcher = rememberLauncherForActivityResult(contract =
ActivityResultContracts.GetContent()) { uri: Uri? ->
imageUri = uri
}
// 카메라로 사진 찍어서 가져오기
val takePhotoFromCameraLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.TakePicturePreview()) { takenPhoto ->
if (takenPhoto != null) {
val baos = ByteArrayOutputStream()
takenPhoto.compress(
Bitmap.CompressFormat.PNG,
100,
baos
)
val b: ByteArray = baos.toByteArray()
val encoded: String = Base64.encodeToString(b, Base64.DEFAULT)
editor.putString("profileImage", encoded)
editor.commit()
imageTy = false
} else {
imageTy = false
Log.e("takenPhoto", "canceled ...")
}
}
그래서 앱의 기능 구조에 맞게 uri는 이미지로 변환해 사용할 것이고, bitmap 은 그대로 저장해서 (byte type으로 전환 후) 사용할 것이기 때문에 코드 구현은 마무리가 되었다.
각각의 호출은 아래 예시와 같이 한다. 앞에 버튼은 갤러리를 호출하는 부분으로 image의 종류는 다 허용할 것이라서 아래 코드와 같이 구현을 하였고, 사진을 가져오는 부분은 카메라 앱을 호출하는 방식으로 구현을 하였다.
Column(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.End
) {
IconButton(onClick = {
imageTy = true
launcher.launch("image/*")
}) {
Icon(
imageVector = Icons.Default.PhotoAlbum,
contentDescription = "Search Profile",
tint = fontColor
)
}
IconButton(onClick = {
imageTy = true
takePhotoFromCameraLauncher.launch()
}) {
Icon(
imageVector = Icons.Default.Camera,
contentDescription = "Take a Picture",
tint = fontColor
)
}
}
이제 그 구현된 모습을 보자면 아래 그림과 같이 구현이 되었다. 프로필 이미지를 받아올 때 방법으로 갤러리와 카메라 버튼을 클릭하는 가에 따라서 위에서 구현된 source 가 동작을 할 것이다.
실행되는 모습은 앱에서 직접 확인하시길... 아직은 upgrade 전이라서 찾아볼 수 없지만, 조만간 기능 구현이 끝나면 앱의 patch 가 실행 예정이다.
'모바일 앱(안드로이드)' 카테고리의 다른 글
JetPack Compose : Cloud Storage에 이미지를 업로드하고 Firestore에 URL을 저장하는 방법은 무엇입니까? (feat 구글링) (0) | 2022.06.09 |
---|---|
안드로이드 앱 만들기 : 주소 API 사용해 Kakao 우편번호 서비스 활용해 보기 (0) | 2022.06.07 |
안드로이드 앱 만들기 : Ktor Server & Ktor Client 에 대해서...(인터넷 펌) (7) | 2022.05.31 |
안드로이드 앱 만들기 : Compose Navigation ... 인터넷 펌. (0) | 2022.05.27 |
안드로이드 앱 만들기 : Splash screen 만들어 보기 (feat 인터넷 펌) (3) | 2022.05.25 |