Camera_API - boostcampwm-2024/and04-Nature-Album GitHub Wiki
https://developer.android.com/media/camera/choose-camera-library?hl=ko
๊ณต์๋ฌธ์์๋ ๋์์๋ฏ์ด CameraX๋ Camera2 ํจํค์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋๋๋ค.
Camera2๋ ๋ณต์กํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ๊ธฐ ์ํด ํ์ ์์ค์ ์นด๋ฉ๋ผ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค.
๋ฌธ์ ๋ Camera2์ API๋ CameraX๋ณด๋ค ๋ ๋ณต์กํ๋ค.
๊ณต์๋ฌธ์์๋ ๋์ ์๋ฏ์ด ํ์ ์์ค์ ์นด๋ฉ๋ผ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ ๋๋ถ๋ถ์ ์ํฉ์์ CameraX์ ์ฌ์ฉ์ด ๊ถ์ฅ๋๋ค๊ณ ๋์์๋ค.
์ฐ๋ฆฌ๊ฐ ์ ํํ ์ ์๋ ์ ํ์ง๋ ๊ทธ๋ผ 2๊ฐ์ง์ด๋ค.
- Intent๋ฅผ ํตํด ๋ด์ฅ ์นด๋ฉ๋ผ ๊ธฐ๋ฅ ์ฌ์ฉ
- CameraX๋ฅผ ํตํด ์ปค์คํ
Q. ์ฐ๋ฆฌ ์ฑ์์๋ ์ด๋ค ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊น?
- Intent๋ฅผ ํตํ ๋ด์ฅ ์นด๋ฉ๋ผ ๊ธฐ๋ฅ ์ฌ์ฉ
- Intent๋ฅผ ํตํด ๊ตฌํํ๋ฏ๋ก ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
- ๋ค๋ง, ๋ด์ฅ ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์ฐ์ ์ฌ์ง์ด ๊ธฐ๊ธฐ ๊ฐค๋ฌ๋ฆฌ์ ์ ์ฅ๋๋ ๋จ์ ์ด ์๋ค.
- ์ฐ๋ฆฌ๊ฐ ์๊ฐํ ๊ธฐ๋ฅ ์ค ํ๋๋ ๊ฐค๋ฌ๋ฆฌ์ ์ ์ฅํ์ง ์๊ณ ์ฑ ๋ด ๋๊ฐ์๋ง ์ ์ฅํ๋ ๊ฒ.
- ๋ ์ฐพ์๋ณด๋ ๋ฌด์กฐ๊ฑด ๊ฐค๋ฌ๋ฆฌ์ ์ ์ฅ๋๋ ๊ฒ์ ์๋์์!!! ์๋ง๋,,,
- ์ด๋์ ์ ์ฅ๋๋ ๊ฑด์ง ์ง์ ํด๋ด์ผํ ๊ฒ ๊ฐ๋ค
- CameraX๋ฅผ ํตํด ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- ๊ตฌํ์ด ์กฐ๊ธ ๋ณต์กํ ์ ์๋ค.
- ๋ค๋ง CameraX๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ป๋ ์ด์ ์ด ์๋ค.
- ์ฌ์ง ์ดฌ์ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ ์๋์ผ๋ก ๊ฐค๋ฌ๋ฆฌ์ ์ ์ฅํ์ง ์์ผ๋ฏ๋ก ์๊ฐํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
- ์ฐ๋ฆฌ๊ฐ ํ์์์ ์๊ฐํ GPS ๊ด๋ จ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
- ์ฆ, ์นด๋ฉ๋ผ๋ฅผ ๋๋ ์ ๋, ๋ผ๋ฒจ์ ์ง์ ํ ๋ ๋ ๋ฒ ํ์ธํ๋ ์์ ์ ํ ํ์๊ฐ ์์ ๊ฒ ๊ฐ๋ค.
- ๊ทธ๋ฅ ์นด๋ฉ๋ผ ์ดฌ์ํ๋ฉด์์ ๋คํธ์ํฌ๊ฐ ๋๊ฒผ์ ๋์ฒ๋ผ ์๋จ์ [GPS๊ฐ ๊บผ์ ธ์์ต๋๋ค] ์ ๊ฐ์ด ์ฌ์ฉ์์๊ฒ ์๋ ค์ฃผ๊ณ ์ฌ์ง ์ดฌ์ ๋ฒํผ์ ๋ง์ผ๋ฉด ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ๋ค.
https://developer.android.com/codelabs/camerax-getting-started?hl=ko#0
https://developer.android.com/media/camera/camerax/preview?hl=ko
CameraX๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ PreviewView
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฆ, XML ์ ํตํด ๊ตฌํํด์ผ ํ๋ ๊ฒ ๊ฐ๋ค.
์นด๋ฉ๋ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
- PreviewView๋ฅผ ๋ ์ด์์์ ์ถ๊ฐ
- CameraProvider ์์ฒญ
- CameraProvider ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ
์ด๋ฏธ์ง ์บก์ณ โ ๊ฐค๋ฌ๋ฆฌ์ ์ ์ฅํ๋ ๊ณผ์
- ImageCapture ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ์ฐธ์กฐ ๊ฐ์ ธ์ค๊ธฐ
- ์ด๋ฏธ์ง๋ฅผ ๋ณด๊ดํ MediaStore ์ฝํ ์ธ ๊ฐ์ ๋ง๋ค๊ธฐ
- OutputFileOptions ๊ฐ์ฒด ๋ง๋ค์ด์ ์ถ๋ ฅ์ MediaStore์ ์ ์ฅํ์ฌ ๋ค๋ฅธ ์ฑ์์ ํ์ํ ์ ์๋๋ก MediaStore ํญ๋ชฉ์ ์ถ๊ฐ
์ ๊ณผ์ ์์ 2๋ฒ, 3๋ฒ ๊ณผ์ ์ ํ์ง ์๊ณ 1๋ฒ ๊ณผ์ ์์์ ๊ฒฐ๊ณผ๋ฌผ๋ง ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
1๋ฒ ๊ณผ์ ์ ๊ฒฐ๊ณผ๋ฌผ์ ImageProxy
์ด๊ณ , ์ด๊ฒ์ ๋นํธ๋งต์ผ๋ก ๋ณํํด์ ์ฌ์ฉํด์ผํ ๊ฒ ๊ฐ๋ค.
1๋ฒ ๊ณผ์ ์์ ์ด๋ฏธ์ง ๊ฒฐ๊ณผ๋ฌผ ๊ฐ์ ธ์ค๊ธฐ
https://developer.android.com/reference/androidx/camera/core/ImageCapture.OnImageCapturedCallback
ImageCapture.OnImageCapturedCallback
์์ onCaptureSuccess
์ฝ๋ฐฑ ์ด์ฉํ๊ธฐ
-
๊ด๋ จ ์ด๋ฏธ์ง
๋จ, ImageProxy
๋ฅผ ๋นํธ๋งต์ผ๋ก ๋ณํํ๋ ์ถ๊ฐ ์์
์ด ํ์ํ๋ค.
Q. Compose๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ ๊น?
-
๋ถ๊ฐ๋ฅํ์ง๋ ์์ ๊ฒ ๊ฐ๋ค.
-
AndroidView ํ์ฉ
-
์์ธํ ๊ฒ์ ์ง์ ํด๋ด์ผํ ๊ฒ ๊ฐ๋ค.
-
์ฌ๋ฌ ๋ธ๋ก๊ทธ์์ ์ฑ๊ณต ์ฌ๋ก๊ฐ ์์
-
์ฐธ๊ณ ์ด๋ฏธ์ง
-
-
val previewView = remember { mutableStateOf<PreviewView>() }
์ด๋ฐ ์์ผ๋ก ๋ฐ์์์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค.
Q. AndroidView???
- Compose UI ๋ด์ ๊ธฐ์กด Android View๋ฅผ ํตํฉํ ์ ์๋๋ก ํ๋ ์ปดํฌ์ ๋ธ
- Compose์์ ์์ง ์ฌ์ฉํ ์ ์๋ UI ์์๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์ ํนํ ์ ์ฉ
Q. ๊ทธ๋ ๋ค๋ฉด NaverMap API์ Compose์์ ์ฌ์ฉ๊ฐ๋ฅํ ๊น?
A. ๊ฐ๋ฅํ๋ค..! โ ๋ฌผ๋ก ๋ณต์กํ๊ณ ์ด๋ ค์โฆ ์๊ทธ๋๋ ๋ณต์กํ map api๋ฅผ 4์ฃผ์์ ์ปดํฌ์ฆ๋ก ๊ตฌํ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ง๋ ์๋ค.
-
์ค์ ๋ก ํ์์์ ์ด์ผ๊ธฐ๋์จ https://github.com/fornewid/naver-map-compose ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ AndroidView๋ฅผ ํ์ฉํ ๊ฒ
-
์์์๋ ๋งํ๋
val mapView = remember { MapView(context, NaverMapOptions()) }
๋ฐฉ์์ผ๋ก MapView๋ฅผ ๋ฐ์์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค. -
์ฐธ๊ณ ์ด๋ฏธ์ง
์๊ฐ์ด ๋๋ค๋ฉด CameraX ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ง ์์๊น?
์ด์
- GPS ๊ถํ ํน์ GPS ์ผ์ง/๊บผ์ง ์ ๊ดํ ์ฒ๋ฆฌํ๊ธฐ ์ฉ์ดํ ๊ฒ ๊ฐ๋ค.
- ์นด๋ฉ๋ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์์ GPS๊ฐ ๊บผ์ ธ์๋ค๋ฉด ์ฌ์ฉ์์๊ฒ ์๋ฆผ๊ณผ ๋์์ ์ดฌ์ ๋ฒํผ ๋นํ์ฑํ
- ์ด ์ธ์๋ ์ดฌ์๋ ์ฌ์ง์ ๊ฐค๋ฌ๋ฆฌ๊ฐ ์๋ ์ฐ๋ฆฌ ์ฑ ๋ด ๋๊ฐ์๋ง ์ ์ฅํ๊ธฐ.
- ์ดํ AI ๋์
์ ์๊ฐํ๋ค๋ฉด CameraX ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค.
- ๊ณต์๋ฌธ์์ ML Kit๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฒํผ์ ์ํํ๊ฒ ์ก์ธ์คํ๋ค๊ณ ๋์์๋ค!
๋ผ๊ณ ์๊ฐํ์ง๋งโฆ ๊ทธ๋ฅ ๋ด์ฅ ์นด๋ฉ๋ผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋คโฆ
https://developer.android.com/media/camera/camera-intents?hl=ko
๊ทผ๋ฐ ์๊ธด๊ฒ ๊ณต์๋ฌธ์ ์ฝ๋๊ฐ deprecated ๋ ์ฝ๋์ด๋ค ์ฅ..
startActivityForResult โ registerForActivityResult ๋ก ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
1. CameraX๋ฅผ ์ฌ์ฉํ๋ค๋ฉด
๋ง์ฝ CameraX๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฉํ๋ฐ์ดํฐ์ ์ ๊ทผํ ํ์๊ฐ ์๋ค.
์ฐ์ ์ฌ์ง ์ดฌ์ ํ ๋ฐํ๊ฐ์ ImageProxy
์ด๋ค.
์ด๊ฒ์ ๋นํธ๋งต์ผ๋ก ์ ํํด์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด Firebase์๋ฒ์ (๋นํธ๋งต, ์์น, ์๊ฐ, ์ฌ์ง ์ ๋ชฉ)์ ์ ์ฅํด์ผ ํ๋ฉฐ,
์ดํ์ ๊ฐค๋ฌ๋ฆฌ์ ์ ์ฅํ๊ธฐ ์ํด์๋ ํด๋น ๋นํธ๋งต์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ ์ ์ฅํ๋ ๊ฒ.
์์ด์ ๋นํธ๋งต์๋ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ์ ์์.
๋นํธ๋งต : ์๋๋ก์ด๋์์ ์ด๋ฏธ์ง๋ฅผ ํํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฐ์ฒด
๋นํธ๋งต์ ํฝ์ ์ ๋ณด๋ฅผ ๋ค ์ ์ฅํด์ผ ํ๊ธฐ์ ์ฉ๋์ด ํฌ๊ณ ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ฆฌ๋ค.
๊ทธ๋ ๊ธฐ์ ์์ถํ์ฌ ์ฌ์ฉํ๋ ๊ฒ?
๋ฉํ๋ฐ์ดํฐ๋ jpeg, jpg๊ฐ์ ํ์ผ์ ํค๋ ๋ถ๋ถ์ ์ ์ฅ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ณ๋๋ก ExifInterface
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ถ๊ฐํ์ฌ ๊ฐค๋ฌ๋ฆฌ์ ์ ์ฅํ๋ ์์
์ด ํ์ํ๋ค.
2. Intent ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด?
GPS๊ฐ ์ผ์ ธ์์ด์ผ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์์น ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ๊ฒ ๊ฐ๋ค.
๊ทผ๋ฐ ์ด์ฉํผ ์น๊ตฌ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๋ ค๋ฉด ๋นํธ๋งต์ผ๋ก ์ ์ฅํด์ผํ์ง ์๋? ์๋๋ฉด ์ด๋ฏธ์ง๋ฅผ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ ํด๋น uri๋ฅผ firestore์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ด์ฉํ๊ฑฐ๋.
์๋ฌดํผโฆ ์ฑ ๋ด๋ถ ์ ์ฅ์๋ฅผ ์ด์ฉํ๋ฉด ๊ฐค๋ฌ๋ฆฌ์ ํ์๋์ง ์๊ณ ๋ Uri๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค?
(์ข ๋ ์กฐ์ฌ ํ์)
-
MediaStore
๋ฅผ ํตํด ์ด๋ฏธ์ง uri ๊ฐ์ ธ์ค๊ธฐ -
ExifInterface
๋ฅผ ํตํด ๋ฉํ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ.
- CameraX
CameraX ๋ฌธ์์ GPS์ ๊ดํ ๊ธ์ด ์๋ค.
gpt๊ฐ CameraX๋ก ์ฐ์ ์ฌ์ง์ ๋ฉํ๋ฐ์ดํฐ์ gps๊ฐ ์๋ค๊ณ ํ๋ค.
๊ทธ๋๋ ํน์๋ํด์ ๊ฐ๋จํ๊ฒ ๊ตฌํํ๊ณ ๋ฉํ๋ฐ์ดํฐ์ gps๊ฐ์ด ์๋์ง ํ์ธํด๋ดค๋๋ฐ ์๋์๋ค.
์ฌ์ง ์ฐ๊ณ ์์น ๊ฐ์ ๋ฃ์ด์ค์ผ ํ ๋ฏ..?
- ๊ธฐ๋ณธ ์นด๋ฉ๋ผ
๊ธฐ๋ณธ ์นด๋ฉ๋ผ๋ฅผ ์ผ์ ์์น ํํฌ๋ฅผ ํ์ฑํ ํด์ฃผ๋ฉด ์ฌ์ง์ ๋ฉํ๋ฐ์ดํฐ์ gps ์ ๋ณด๊ฐ ์๋ค.
์ฐธ๊ณ ) ์นดํก, ์ฌ๋ โ ๊ธฐ๋ณธ ์นด๋ฉ๋ผ๋ก ์ฐ๊ฒฐ
- CameraX
- ์ฅ์
- ์ฑ ๋ด์์ ์ค์๊ฐ ์นด๋ฉ๋ผ ํ๋ฉด์ ํ์ธํ ์ ์๋ ์๋ค๋ฅธ ux ์ ๊ณต
- ์ปค์คํ ๊ฐ๋ฅ
- ๋์ค์ ๊ฐ์ฒด ์ธ์ํ ๋ ๋์์ด ๋ ์๋
- ๋จ์
- ๊ธธ์ด์ง๋ ์ฝ๋ ์โฆ.
- ์์น ์ ๋ณด๋ฅผ ์ง์ ๋ฃ์ด์ค์ผ ํจ
- ์ฅ์
- ๊ธฐ๋ณธ ์นด๋ฉ๋ผ
- ์ฅ์
- ๊ฐ๋จํ ๊ตฌํ
- ์์น ํ๊ทธ๋ฅผ ํ์ฑํ ํ๊ณ ์ฐ์ผ๋ฉด ๋ฉํ๋ฐ์ดํฐ์ ์์น ์ ๋ณด๊ฐ ์์
- ๋จ์
- ์ฌ์ฉ์๊ฐ ์ง์ ์์น ํ๊ทธ๋ฅผ ํ์ฑํ ํด์ผํจ
- ์ฅ์
extension๊ธฐ๋ฅ(์นด๋ฉ๋ผ ๋ชจ๋: Auto, Bokeh, Face Retouch, HDR, Night)์ sdk31|32์ด์ ์ง์
Camera2/x ๊ฐ๊ฐ์ sdk 21์ด์
Intent ์นด๋ฉ๋ผ : ์ฑ ์์ฒด์ GPS๊ถํ์ด ๊บผ์ ธ ์์ ๋ ์์นํ๊ทธ ์ค์ ๋ถ๊ฐ

๋ด๋ถ ์ ์ฅ(โ DB)

~~์ธ๋ถ ์ ์ฅ์์ ์ ์ฅํ์ง ์๊ณ ๋ด๋ถ ์ ์ฅ์์ ์ ์ฅ ๊ฐ๋ฅ. BUT, Bitmap๋ง์ Intent๋ก ๋ฐ์์ ๋ฉํ๋ฐ์ดํฐx~~
~~โ Intent๋ฅผ ์ฌ์ฉํ๋ค๋ฉด~~
1. ~~์ธ๋ถ ์ ์ฅ์์ ์ฌ์ง(+๋ฉํ๋ฐ์ดํฐ) ์ ์ฅํ Bundle๋ก URI๋ฅผ ๋ฐ์์ ์ฑ ๋ด๋ถ์์ ํ์ผ ์ฝ๊ธฐ~~
2. ~~Bundle๋ก Bitmap์ ๋ฐ์์ค๊ณ , ์๊ฐ/์์น ์ ๋ณด๋ ์ฑ ๋ด๋ถ์์ ์์ฑ ๋ฐ ์ ์ฅ~~
~~์ถ๊ฐ๋ก ๊ณ ๋ฏผํ ๋ถ๋ถ~~
- ~~DB์ Bitmap์ผ๋ก ์ ์ฅ? โ ์์ถx, ์ฉ๋ ์ปค์ง, ๋นํธ๋งต์ ๋ฐ๋ก ๊ทธ๋ฆด ์ ์์~~
- ~~๋ด๋ถ ์ ์ฅ์์ JPEG๋ก ์ ์ฅ? โ ์์ถo, ์ฉ๋ ์ค์ด๋ฌ, DB์ URI๋ฅผ ์ ์ฅํด ๋ถ๋ฌ์ฌ๋ ํ๋จ๊ณ๋ฅผ ๋ ๊ฑฐ์นจ~~

๋ฉํ ๋ฐ์ดํฐ ํฌํจํด ์ฌ์ง ์ ์ฅ ๊ฐ๋ฅ!!!!!!!!!
API | ์ง์ ์์ ๋ฒ์ | ํ์ฌ ์ํ | ์ฃผ์ ํน์ง | ๊ถ์ฅ ์ฌ์ฉ ์ฌ๋ถ -- | -- | -- | -- | -- ๋ด์ฅ ์นด๋ฉ๋ผ | ๋ชจ๋ ๋ฒ์ | ํ์ฑ | ์์คํ ๊ธฐ๋ณธ ์นด๋ฉ๋ผ ์ฑ์ ํธ์ถํ์ฌ ์ฌ์ง ๋๋ ๋์์์ ์ดฌ์ํจ. | ํน์ ์ํฉ์์ ์ฌ์ฉ ๊ฐ๋ฅ Camera1 | API ๋ ๋ฒจ 1 | ์ฌ์ฉ ์ค๋จ๋จ | ์ด๊ธฐ ์นด๋ฉ๋ผ API๋ก, ์ ํ๋ ๊ธฐ๋ฅ๊ณผ ๋ณต์กํ ์ฌ์ฉ๋ฒ์ ๊ฐ์ง. | ์ฌ์ฉ ๊ถ์ฅ๋์ง ์์ Camera2 | API ๋ ๋ฒจ 21 | ํ์ฑ | ํฅ์๋ ๊ธฐ๋ฅ๊ณผ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง, ๊ตฌํ์ด ๋ณต์กํจ. | ๊ณ ๊ธ ๊ธฐ๋ฅ ํ์ ์ ์ฌ์ฉ CameraX | API ๋ ๋ฒจ 21 | ํ์ฑ | Camera2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ Jetpack ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ฌ์ฉ์ด ๊ฐํธํ๊ณ ๊ธฐ๊ธฐ ํธํ์ฑ์ด ๋์. | ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋จ
1. ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋จผ์ ๋์ค๊ณ ํ์ฅ๋์๋๊ฐ?
-
Camera1์ด ๊ฐ์ฅ ๋จผ์ ๋์ ๋์์ผ๋ฉฐ, ์ดํ Camera2๊ฐ 1์ ๋์ฒด
-
CameraX๋ Camera2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋ Jetpack ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฑ์์ Android 5.0(API ์์ค 21)๋ถํฐ ์ง์ ์ค๋จ๋ ์๋
Camera
ํด๋์ค('Camera1')๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ต์ Android ์นด๋ฉ๋ผ API๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.https://developer.android.com/media/camera/camerax/camera1-to-camerax?hl=ko
2. ๊ณต์ ๋ฌธ์๋ ์ด๋ค ์นด๋ฉ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ถ์ฅํ๋๊ฐ?
-
์๋๋ก์ด๋ ๊ณต์ ๋ฌธ์๋ CameraX ์ฌ์ฉ์ ๊ถ์ฅ
-
์ฌ์ฉ ํธ์์ฑ, ๊ธฐ๊ธฐ ๊ฐ ์ผ๊ด์ฑ, ํธํ์ฑ ๋ฑ์ ์ด์
CameraX๋ Android 5.0(API ์์ค 21) ์ด์์ ์คํํ๋ ๊ธฐ๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค. ์ด๋ ๊ธฐ์กด Android ๊ธฐ๊ธฐ์ 98%๊ฐ ๋์ต๋๋ค.
https://developer.android.com/media/camera/camerax/camera1-to-camerax?hl=ko
- ๋ํ, 1๊ณผ ๋ฌ๋ฆฌ X๋ ์๋์ฒ๋ผ ๊ฐ๋ ์ ์ผ๋ก ๋ ํธ๋ฆฌํจ
API | ์ง์ ์์ ๋ฒ์ | ํ์ฌ ์ํ | ์ฃผ์ ํน์ง | ๊ถ์ฅ ์ฌ์ฉ ์ฌ๋ถ |
---|---|---|---|---|
๋ด์ฅ ์นด๋ฉ๋ผ | ๋ชจ๋ ๋ฒ์ | ํ์ฑ | ์์คํ ๊ธฐ๋ณธ ์นด๋ฉ๋ผ ์ฑ์ ํธ์ถํ์ฌ ์ฌ์ง ๋๋ ๋์์์ ์ดฌ์ํจ. | ํน์ ์ํฉ์์ ์ฌ์ฉ ๊ฐ๋ฅ |
Camera1 | API ๋ ๋ฒจ 1 | ์ฌ์ฉ ์ค๋จ๋จ | ์ด๊ธฐ ์นด๋ฉ๋ผ API๋ก, ์ ํ๋ ๊ธฐ๋ฅ๊ณผ ๋ณต์กํ ์ฌ์ฉ๋ฒ์ ๊ฐ์ง. | ์ฌ์ฉ ๊ถ์ฅ๋์ง ์์ |
Camera2 | API ๋ ๋ฒจ 21 | ํ์ฑ | ํฅ์๋ ๊ธฐ๋ฅ๊ณผ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง, ๊ตฌํ์ด ๋ณต์กํจ. | ๊ณ ๊ธ ๊ธฐ๋ฅ ํ์ ์ ์ฌ์ฉ |
CameraX | API ๋ ๋ฒจ 21 | ํ์ฑ | Camera2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ Jetpack ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ฌ์ฉ์ด ๊ฐํธํ๊ณ ๊ธฐ๊ธฐ ํธํ์ฑ์ด ๋์. | ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋จ |
1. ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋จผ์ ๋์ค๊ณ ํ์ฅ๋์๋๊ฐ?
-
Camera1์ด ๊ฐ์ฅ ๋จผ์ ๋์ ๋์์ผ๋ฉฐ, ์ดํ Camera2๊ฐ 1์ ๋์ฒด
-
CameraX๋ Camera2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋ Jetpack ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฑ์์ [Android 5.0(API ์์ค 21)](https://developer.android.com/about/versions/lollipop?hl=ko)๋ถํฐ ์ง์ ์ค๋จ๋ ์๋
[Camera](https://developer.android.com/reference/android/hardware/Camera?hl=ko)
ํด๋์ค('Camera1')๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ต์ Android ์นด๋ฉ๋ผ API๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.https://developer.android.com/media/camera/camerax/camera1-to-camerax?hl=ko
2. ๊ณต์ ๋ฌธ์๋ ์ด๋ค ์นด๋ฉ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ถ์ฅํ๋๊ฐ?
-
์๋๋ก์ด๋ ๊ณต์ ๋ฌธ์๋ CameraX ์ฌ์ฉ์ ๊ถ์ฅ
-
์ฌ์ฉ ํธ์์ฑ, ๊ธฐ๊ธฐ ๊ฐ ์ผ๊ด์ฑ, ํธํ์ฑ ๋ฑ์ ์ด์
CameraX๋ [Android 5.0(API ์์ค 21)](https://developer.android.com/about/versions/lollipop?hl=ko) ์ด์์ ์คํํ๋ ๊ธฐ๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค. ์ด๋ ๊ธฐ์กด Android ๊ธฐ๊ธฐ์ 98%๊ฐ ๋์ต๋๋ค.
https://developer.android.com/media/camera/camerax/camera1-to-camerax?hl=ko
- ๋ํ, 1๊ณผ ๋ฌ๋ฆฌ X๋ ์๋์ฒ๋ผ ๊ฐ๋ ์ ์ผ๋ก ๋ ํธ๋ฆฌํจ
3. ๋ด์ฅ ์นด๋ฉ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ?
- ๋ด์ฅ ์นด๋ฉ๋ผ๋ ์์คํ ์ ๊ธฐ๋ณธ ์นด๋ฉ๋ผ ์ฑ์ ํธ์ถํ์ฌ ์ฌ์ง์ด๋ ๋์์์ ์ดฌ์ํ๋ ๋ฐฉ์
- ์นด๋ฉ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฑ ๋ด์์ ์ง์ ์นด๋ฉ๋ผ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ์ปค์คํฐ๋ง์ด์งํ ์ ์์
3-1. ๋ด์ฅ ์นด๋ฉ๋ผ๋ก ์ฌ์ง ์ฐ๊ณ ์ ์ฅ, ์์น ๊ฐ ์ ์ฅ ๋ฑ์ ์ด๋ป๊ฒ ๊ตฌํํ๋๊ฐ?
-
๋ด์ฅ ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด
Intent
๋ฅผ ํตํด ์์คํ ์ ์นด๋ฉ๋ผ ์ฑ์ ํธ์ถํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌ - ์์น ์ ๋ณด๋ ๋ณ๋๋ก
LocationManager
๋ฅผ ํตํด ํ๋ํ์ฌ ์ ์ฅํด์ผ ํจ- ์๋๋ก์ด๋ ์์คํ ์นด๋ฉ๋ผ์ ์ฌ์ฉ (https://m.blog.naver.com/kimbic_/223122736210)
- **์๋๋ก์ด๋ ์นด๋ฉ๋ผX : ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ํ๋ฆฌ๋ทฐ(**https://m.blog.naver.com/kimbic_/223158937894)
- ์นด๋ฉ๋ผX๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์ด๋ฏธ์ง๋ถ์, ์ด๋ฏธ์ง์บก์ณ, ๋น๋์ค ์บก์ฒ๋ฅผ ์ฌ์ฉํ ์ ์์
Q. ๊ทผ๋ฐ ์ด์ LG ํธ๋ํฐ์ ์์น ํ๊ทธ ์์๋?
https://www.samsungsvc.co.kr/solution/37015
3-2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ ์ด๋ป๊ฒ ์ฌ์ง ์ฐ๊ณ ์ ์ฅ, ์์น๊ฐ ์ ์ฅ์ ๊ตฌํํ๋๊ฐ?
- CameraX์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ ๋ด์์ ์ง์ ์ฌ์ง ์ดฌ์ ๊ธฐ๋ฅ์ ๊ตฌํ ๊ฐ๋ฅ
- ์์น ์ ๋ณด๋
LocationManager
๋ฅผ ํตํด ํ๋ํ ํ, ์ดฌ์ํ ์ด๋ฏธ์ง์ ๋ฉํ๋ฐ์ดํฐ์ ์ถ๊ฐํ์ฌ ์ ์ฅ
3-3. ๋ด์ฅ ์นด๋ฉ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ค ์ฐจ์ด๊ฐ ์๋๊ฐ?
- ๋ด์ฅ ์นด๋ฉ๋ผ๋ ๊ตฌํ์ด ๊ฐ๋จํ์ง๋ง ์ปค์คํฐ๋ง์ด์ง ์ด๋ ค์
- ์นด๋ฉ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ
4. Compose๋ก ํ๋ฉด์ ๊ตฌ์ฑํ๋ค๋ฉด ๋ด์ฅ ์นด๋ฉ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ์ด๋ ํ ๊ฒ์ด ์ ํฉํ๊ฐ?
-
Jetpack Compose๋ก ํ๋ฉด์ ๊ตฌ์ฑํ ๋๋ CameraX์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. CameraX๋ Jetpack ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
https://developer.android.com/jetpack/androidx/releases/camera?hl=ko
Camera Viewfinder Compose ๋ฒ์ 1.0
- CameraX๋ก UI ์ปค์คํฐ๋ง์ด์ง ์ด๋ป๊ฒ ํ๋?
- CameraX๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด์ฅ ์นด๋ฉ๋ผ ์ฑ๊ณผ ๋ฌ๋ฆฌ ์นด๋ฉ๋ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋ฉด๊ณผ ์ฌ์ง ์ดฌ์ ๋ฒํผ์ ํฌํจํ UI ์์๋ฅผ ์์ ๋กญ๊ฒ ์ปค์คํฐ๋ง์ด์ฆํ ์ ์์ด์ ์ฐ๋ฆฌ ์ฑ ๋ง์ ์นด๋ฉ๋ผ๋ฅผ ๊ตฌํํ ์ ์์ ๋ฏํจ.
- ์ดฌ์ ๋ฒํผ ๋ฐ UI ์์์ ๋์์ธ: ์ฌ์ง ์ดฌ์ ๋ฒํผ, ๋์์ ๋ นํ ๋ฒํผ ๋ฑ ๋ค์ํ UI ์์๋ฅผ ์ง์ ๋์์ธํ๊ณ ๋ฐฐ์น ๊ฐ๋ฅํ์ฌ ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ ํ๋ก์ ํธ ์์ด๋ดํฐํฐ์ ๋ง๋ ๊ณ ์ ํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ ์ ์์ ๊ฒ์ผ๋ก ๋ณด์
- ์ค, ํ๋์, ํํฐ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ์ดํ ์๋ ์๋ค๊ณ ํจ.
- https://developer.android.com/codelabs/camerax-getting-started?hl=ko#8
- https://www.youtube.com/watch?v=XUN6mUQiDpg
- https://youtu.be/2tHhfmga6ZA?si=q6z8dlPtUbVRleiD
-
https://velog.io/@lyh990517/Android-CameraX-๋ฅผ-Jetpack-Compose์์-ํ์ฉํด๋ณด์
- ์ด ์ฌ๋ ๊ฒ ๋์ค์ ์ฐธ๊ณ ํด๋ณด๊ธฐ
- CameraX๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ง์ ์ดฌ์ํ ๋, ์์น ์ ๋ณด๋ฅผ ๋ฉํ๋ฐ์ดํฐ์ ํฌํจ์ํค๋ ค๋ฉด?
-
ImageCapture.Metadata
[
getLocation](<https://developer.android.com/reference/androidx/camera/core/ImageCapture.Metadata#getLocation()>)()
Gets the geographic location of the capture.
- ์์น ๊ถํ ์์ฒญ ๋ฐ ์์น ์ ๋ณด ํ๋:
-
ACCESS_FINE_LOCATION
๊ถํ์ ๋งค๋ํ์คํธ์ ์ ์ธ - ๋ฐํ์์ ์ฌ์ฉ์๋ก๋ถํฐ ํด๋น ๊ถํ์ ์์ฒญ
-
LocationManager
๋๋FusedLocationProviderClient
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ์์น๋ฅผ ๊ฐ์ ธ์ค๊ธฐ
- ์ดฌ์ ์ ์์น ์ ๋ณด ํฌํจ:
-
ImageCapture.OutputFileOptions.Builder
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ง ์ ์ฅ ์ต์ ์ ์ค์ ํ ๋,setMetadata()
๋ฉ์๋๋ฅผ ํตํด ์์น ์ ๋ณด๋ฅผ ํฌํจ -
ImageCapture.Metadata
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ,setLocation()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ํ ์์น ์ ๋ณด๋ฅผ ์ค์
-
LocationManager์ FusedLocationProvider์ ์ฐจ์ด์
ํญ๋ชฉ LocationManager FusedLocationProviderClient ์ ๊ณต ์ฃผ์ฒด ์๋๋ก์ด๋ ํ๋ ์์ํฌ์ ๊ธฐ๋ณธ ์์น ์๋น์ค Google Play ์๋น์ค์ ์์น API ์์น ์ ๋ณด ์์ง ๋ฐฉ์ GPS, ๋คํธ์ํฌ ๋ฑ ๊ฐ๋ณ ํ๋ก๋ฐ์ด๋๋ฅผ ํตํด ์์ง GPS, Wi-Fi, ๊ฐ์๋๊ณ ๋ฑ ๋ค์ํ ์ผ์์ ์ ํธ๋ฅผ ์ง๋ฅ์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ์์ง ์ ํ๋ ํ๋ก๋ฐ์ด๋์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ด๋ฆฌํด์ผ ํจ ์ฌ๋ฌ ์์ค๋ฅผ ํตํฉํ์ฌ ๋์ ์ ํ๋์ ์์น ์ ๋ณด๋ฅผ ์ ๊ณต ๋ฐฐํฐ๋ฆฌ ํจ์จ์ฑ ํ๋ก๋ฐ์ด๋ ์ฌ์ฉ์ ๋ฐ๋ผ ๋ฐฐํฐ๋ฆฌ ์๋ชจ๊ฐ ํด ์ ์์ ๋ฐฐํฐ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ ํํ์ฌ ํจ์จ์ ์ธ ์์น ์ ๋ณด๋ฅผ ์ ๊ณต ์ฌ์ฉ ํธ์์ฑ ์ค์ ๊ณผ ๊ด๋ฆฌ๊ฐ ๋ณต์กํ์ฌ ๊ตฌํ์ด ์ด๋ ค์ธ ์ ์์ ๊ฐ๋จํ API๋ก ๊ตฌํ์ด ์ฉ์ดํ๋ฉฐ, ๋ค์ํ ์ํฉ์ ๋ง๋ ์์น ์์ฒญ ์ต์ ์ ์ ๊ณต ์ง์ ๋ฒ์ ๋ชจ๋ ์๋๋ก์ด๋ ๊ธฐ๊ธฐ์์ ์ฌ์ฉ ๊ฐ๋ฅ Google Play ์๋น์ค๊ฐ ์ค์น๋ ๊ธฐ๊ธฐ์์ ์ฌ์ฉ ๊ฐ๋ฅ ์ ๋ฐ์ดํธ ๋ฐ ์ ์ง๋ณด์ ์๋๋ก์ด๋ OS ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ ์ง๋ณด์๋๋ฉฐ, ์ ๋ฐ์ดํธ ์ฃผ๊ธฐ๊ฐ ๋น๊ต์ ๊น Google Play ์๋น์ค ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ง์์ ์ผ๋ก ๊ฐ์ ๋๋ฉฐ, ์๋ก์ด ๊ธฐ๋ฅ์ด ๋น ๋ฅด๊ฒ ์ถ๊ฐ๋จ ์ต์ ์๋๋ก์ด๋ ๊ฐ๋ฐ์์๋ FusedLocationProviderClient๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋๋ค๊ณ ํจ. ๋ ํจ์จ์ ์ด๊ณ ์ ํํ ์์น ์ ๋ณด ๋๋ฌธ์ด๋ค.
- https://krrong.tistory.com/295
-
https://chanho-study.tistory.com/91
- ์ด ์ฌ๋์ ํ๋ก์ ํธ์์ LocationManager ์ฌ์ฉํ๋๋ฐ, ์์น ์ ๋๋ก ๋ชป๋ฐ์์ค๋ ๋ฌธ์ ์์ด์ Fused Location Provider ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ค๊ณ ํจ.
- https://developers.google.com/location-context/fused-location-provider?hl=ko
- https://developer.android.com/develop/sensors-and-location/location/retrieve-current?hl=ko
-
๊ฐํธํ ์ฌ์ฉ์ฑ๊ณผ ๋์ ํธํ์ฑ
- CameraX๋ Jetpack ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Camera2์ ๋ณต์กํจ์ ๊ฐ์ํํ์ฌ ๊ฐ๋ฐ์ ์นํ์ ์ธ API๋ฅผ ์ ๊ณต
- ์๋๋ก์ด๋ 5.0(API ๋ ๋ฒจ 21) ์ด์์ ์ง์ํด ๋๋ถ๋ถ์ ๊ธฐ๊ธฐ์์ ์ฌ์ฉํ ์ ์์
-
UI ์ปค์คํฐ๋ง์ด์ง์ ์ฉ์ด์ฑ
- CameraX๋ Camera2์ ๋ฌ๋ฆฌ, Jetpack Compose์์ ์ฐ๋์ ํตํด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ๋ฉด, ์ดฌ์ ๋ฒํผ ๋ฑ์ UI ์์๋ฅผ ์ฝ๊ฒ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ด ํ๋ก์ ํธ์ ๊ณ ์ ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณต
- GPS ์ฐ๊ฒฐ ์ฌ๋ถ๋ ๊ธฐํ ํ์ํ๋ฉด ์ข์ ๊ฒ๋ UI๋ก ์ปค์คํฐ๋ง์ด์ง ํด์ ํ์ ๊ฐ๋ฅ
-
์์น ์ ๋ณด ์ ์ฅ ๊ธฐ๋ฅ
- CameraX๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ง์ ์ดฌ์ํ ๋,
FusedLocationProviderClient
๋ก ํ๋ํ ์์น ์ ๋ณด๋ฅผ ๋ฉํ๋ฐ์ดํฐ์ ํฌํจ์ํฌ ์ ์์ด, ์ฌ์ง์ ์ดฌ์ ์์น๋ฅผ ๊ธฐ๋กํ ์ ์์- FusedLocationProviderClient๋ GPS, Wi-Fi, ๊ฐ์๋๊ณ ๋ฑ ๋ค์ํ ์ผ์๋ฅผ ๊ฒฐํฉํด ๋์ ์ ํ๋์ ์์น ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ฐฐํฐ๋ฆฌ ํจ์จ์ฑ ๋ํ ์ฐ์ํ๋ค๊ณ ํจ. Google Play ์๋น์ค์ ์์น API๋ก ์ต์ ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์๋จ
- CameraX๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ง์ ์ดฌ์ํ ๋,
- [Android] CameraX ๋ฅผ Jetpack Compose์์ ํ์ฉํด๋ณด์!
- https://velog.io/@lyh990517/Android-CameraX-๋ฅผ-Jetpack-Compose์์-ํ์ฉํด๋ณด์
- https://developer.android.com/media/camera/camera2/multi-camera?hl=ko
- https://developers-kr.googleblog.com/2020/03/whats-new-in-camerax.html
์ฐธ๊ณ ์ฉ ์ฝ๋
```kotlin
fun getPhotoLocation(context: Context, uri: Uri): Pair<Double, Double>? {
return try {
// URI์์ InputStream์ ์ป์ด ExifInterface ์์ฑ
val inputStream = context.contentResolver.openInputStream(uri)
val exif = inputStream?.let { ExifInterface(it) }
inputStream?.close()
// GPS ์๋์ ๊ฒฝ๋ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
val lat = exif?.getAttribute(ExifInterface.TAG_GPS_LATITUDE)
val latRef = exif?.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF)
val lon = exif?.getAttribute(ExifInterface.TAG_GPS_LONGITUDE)
val lonRef = exif?.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF)
if (lat != null && lon != null && latRef != null && lonRef != null) {
// ์๋ ๋ฐ ๊ฒฝ๋ ๋ณํ
val latitude = convertToDegree(lat, latRef)
val longitude = convertToDegree(lon, lonRef)
Log.d("GPSInfo","${latitude} - ${longitude}")
Pair(latitude, longitude)
} else {
Log.d("GPSInfo", "์์น ์ ๋ณด๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.")
null
}
} catch (e: Exception) {
e.printStackTrace()
Log.d("GPSInfo","error")
null
}
}
private fun convertToDegree(value: String, ref: String): Double {
val parts = value.split(",")
// ๊ฐ ๋ถ๋ถ์ ๋ถ์ ํ์์ผ๋ก ๋ณํ
val degrees = convertToDouble(parts[0].trim())
val minutes = convertToDouble(parts[1].trim()) / 60
val seconds = convertToDouble(parts[2].trim()) / 3600
val result = degrees + minutes + seconds
return if (ref == "S" || ref == "W") -result else result
}
private fun convertToDouble(value: String): Double {
return if (value.contains("/")) {
// ๋ถ์ ํ์ ์ฒ๋ฆฌ
val fraction = value.split("/")
if (fraction.size == 2) {
fraction[0].toDouble() / fraction[1].toDouble()
} else {
0.0
}
} else {
// ์ผ๋ฐ ํ์ ์ฒ๋ฆฌ
value.toDoubleOrNull() ?: 0.0
}
}