CameraX
CameraX는 Camera2 패키지를 기반으로 만들어진 Jetpack 라이브러리입니다.
CameraX는 Camera2보다 API가 훨씬 단순하고 기기 호환성 문제가 없기 때문에 안드로이드에서 권장하고 있습니다.
- 미리보기, 이미지 분석, 이미지 캡처 등의 use case를 활용해 카메라 앱을 제작
- 추가적으로 인물 사진, HDR, 야간, 뷰티 등의 네이티브 카메라 기능을 편리하게 사용
- 저수준의 기기별 코드를 포함할 필요 X
- API 21부터 사용 가능
CameraX 개요 | Android 개발자 | Android Developers
컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. CameraX 개요 Android Jetpack의 구성요소 CameraX는 더 쉬운 카메라 앱 개발을 위해 빌드된 Jetpack 라이브러리입니
developer.android.com
CameraX 구현하기
1. Manifest에 권한 선언
CameraX를 사용하기 위해서 카메라에 대한 권한을 추가합니다.
<uses-permission android:name="android.permission.CAMERA" />
2. build.gradle에 의존성 추가
CameraX를 사용하기 위해서 build.gradle에 CameraX 라이브러리를 추가합니다.
def camerax_version = "1.2.3"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:${camerax_version}"
implementation "androidx.camera:camera-extensions:${camerax_version}"
3. 카메라 권한 체크
카메라 권한을 체크하여 거절되어 있을 경우에는 해당 권한을 요청하고, 허용되어 있다면 Preview를 띄우는 메서드를 실행합니다.
private fun permissionCheck(context: Context) {
val permissionList = listOf(Manifest.permission.CAMERA)
if (!PermissionUtil.checkPermission(context, permissionList)) {
PermissionUtil.requestPermission(context as Activity, permissionList)
} else {
openPreview()
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
var flag = true
if (grantResults.isNotEmpty()) {
for ((i, _) in permissions.withIndex()) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
flag = false
}
}
if (flag) {
openPreview()
} else {
Toast.makeText(context, "권한을 허용해야합니다.", Toast.LENGTH_SHORT).show()
(context as Activity).finish()
}
}
}
4. PreviewView 설정
먼저 ProcessCameraProvider를 요청합니다.
ProcessCameraProvider는 Camera의 생명주기를 LifeCycleOwner의 생명 주기에 binding 하는 역할을 수행합니다.
private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider>
private fun openPreview() {
cameraProviderFuture = ProcessCameraProvider.getInstance(context)
.also { providerFuture ->
providerFuture.addListener({
startPreview(context)
}, ContextCompat.getMainExecutor(context))
}
}
CameraSelector을 통해 카메라를 세팅할 수 있는데, 전면 또는 후면 카메라로 설정할 수 있습니다.
또한, Preview를 통해서 카메라 미리보기 화면을 구현할 수 있습니다.
SurfaceProvider는 데이터를 받을 준비가 되었다는 신호를 카메라에게 보내주는 역할을 합니다.
여기서 setSurfaceProvider()를 사용해 PreviewView에 SurfaceProvider를 제공해줍니다.
private val cameraSelector by lazy {
CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_FRONT)
.build()
}
private val preview by lazy {
Preview.Builder()
.build()
.also {
it.setSurfaceProvider(previewView.surfaceProvider)
}
}
그 다음, 생명 주기에 binding 할 수 있는 ProcessCameraProvider 객체를 가져옵니다.
binding 전에 모든 binding 되어 있는 것을 초기화하고 CameraSelector와 Preview를 생명 주기에 binding 합니다.
private fun startPreview(context: Context) {
val cameraProvider = cameraProviderFuture.get()
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
context as LifecycleOwner,
cameraSelector,
preview,
)
} catch (e: Exception) {
Log.e("Camera", "binding failed", e)
}
}
'안드로이드 > 활용' 카테고리의 다른 글
[Android] BindingAdapter 사용하기 (0) | 2023.10.09 |
---|---|
[Android] ML Kit를 사용하여 얼굴 인식 (0) | 2023.10.07 |
[Android] ExoPlayer 사용하기 (0) | 2023.10.05 |
[Android] Cloud Firestore와 Cloud Storage 사용하기 (0) | 2023.09.29 |
[Android] 카카오 로그인 구현하기 (0) | 2023.09.22 |
CameraX
CameraX는 Camera2 패키지를 기반으로 만들어진 Jetpack 라이브러리입니다.
CameraX는 Camera2보다 API가 훨씬 단순하고 기기 호환성 문제가 없기 때문에 안드로이드에서 권장하고 있습니다.
- 미리보기, 이미지 분석, 이미지 캡처 등의 use case를 활용해 카메라 앱을 제작
- 추가적으로 인물 사진, HDR, 야간, 뷰티 등의 네이티브 카메라 기능을 편리하게 사용
- 저수준의 기기별 코드를 포함할 필요 X
- API 21부터 사용 가능
CameraX 개요 | Android 개발자 | Android Developers
컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. CameraX 개요 Android Jetpack의 구성요소 CameraX는 더 쉬운 카메라 앱 개발을 위해 빌드된 Jetpack 라이브러리입니
developer.android.com
CameraX 구현하기
1. Manifest에 권한 선언
CameraX를 사용하기 위해서 카메라에 대한 권한을 추가합니다.
<uses-permission android:name="android.permission.CAMERA" />
2. build.gradle에 의존성 추가
CameraX를 사용하기 위해서 build.gradle에 CameraX 라이브러리를 추가합니다.
def camerax_version = "1.2.3" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" implementation "androidx.camera:camera-view:${camerax_version}" implementation "androidx.camera:camera-extensions:${camerax_version}"
3. 카메라 권한 체크
카메라 권한을 체크하여 거절되어 있을 경우에는 해당 권한을 요청하고, 허용되어 있다면 Preview를 띄우는 메서드를 실행합니다.
private fun permissionCheck(context: Context) { val permissionList = listOf(Manifest.permission.CAMERA) if (!PermissionUtil.checkPermission(context, permissionList)) { PermissionUtil.requestPermission(context as Activity, permissionList) } else { openPreview() } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { var flag = true if (grantResults.isNotEmpty()) { for ((i, _) in permissions.withIndex()) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { flag = false } } if (flag) { openPreview() } else { Toast.makeText(context, "권한을 허용해야합니다.", Toast.LENGTH_SHORT).show() (context as Activity).finish() } } }
4. PreviewView 설정
먼저 ProcessCameraProvider를 요청합니다.
ProcessCameraProvider는 Camera의 생명주기를 LifeCycleOwner의 생명 주기에 binding 하는 역할을 수행합니다.
private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider> private fun openPreview() { cameraProviderFuture = ProcessCameraProvider.getInstance(context) .also { providerFuture -> providerFuture.addListener({ startPreview(context) }, ContextCompat.getMainExecutor(context)) } }
CameraSelector을 통해 카메라를 세팅할 수 있는데, 전면 또는 후면 카메라로 설정할 수 있습니다.
또한, Preview를 통해서 카메라 미리보기 화면을 구현할 수 있습니다.
SurfaceProvider는 데이터를 받을 준비가 되었다는 신호를 카메라에게 보내주는 역할을 합니다.
여기서 setSurfaceProvider()를 사용해 PreviewView에 SurfaceProvider를 제공해줍니다.
private val cameraSelector by lazy { CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_FRONT) .build() } private val preview by lazy { Preview.Builder() .build() .also { it.setSurfaceProvider(previewView.surfaceProvider) } }
그 다음, 생명 주기에 binding 할 수 있는 ProcessCameraProvider 객체를 가져옵니다.
binding 전에 모든 binding 되어 있는 것을 초기화하고 CameraSelector와 Preview를 생명 주기에 binding 합니다.
private fun startPreview(context: Context) { val cameraProvider = cameraProviderFuture.get() try { cameraProvider.unbindAll() cameraProvider.bindToLifecycle( context as LifecycleOwner, cameraSelector, preview, ) } catch (e: Exception) { Log.e("Camera", "binding failed", e) } }
'안드로이드 > 활용' 카테고리의 다른 글
[Android] BindingAdapter 사용하기 (0) | 2023.10.09 |
---|---|
[Android] ML Kit를 사용하여 얼굴 인식 (0) | 2023.10.07 |
[Android] ExoPlayer 사용하기 (0) | 2023.10.05 |
[Android] Cloud Firestore와 Cloud Storage 사용하기 (0) | 2023.09.29 |
[Android] 카카오 로그인 구현하기 (0) | 2023.09.22 |