일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Android Apk 이름
- Kotlin
- 안드로이드
- DataTable
- tomcat
- Android
- Firebase
- android error
- fragment
- error
- Eclipse
- release Apk
- Exception
- R프로그래밍
- Program type already present
- release unsigned
- CSS사용법
- jQuery
- apache gzip
- css
- html
- Java
- JavaScript
- FLUTTER
- Android Apk 이름 변경
- MySQL
- android fragment
- java error
- spring
- Android Apk
- Today
- Total
selfstarter
Android Camera2 본문
Camera API 자료
https://developer.android.com/guide/topics/media/camera?hl=ko
https://medium.com/google-developers/detecting-camera-features-with-camera2-61675bb7d1bf#.2x3icoqnc
Android Camera2 Class : https://developer.android.com/reference/android/hardware/camera2/package-summary.html
Camera2 특징
- 기존에는 Camera 기능을 사용하기 위해 Intent를 사용했지만 따로 Classs를 세분화 시켜 좀 더 많은 기능을 추가
- 더 빠른 간격으로 사진을 찍을 수 있음
- 여러대의 카메라 사용 가능
- 필터 효과 추가
사용법
1. 카메라 가져오기
모든 카메라에 접근이 가능하고, 카메라 Device 정보를 가지고 있는 CameraCharacteristics 객체를 얻을 수 있다
CameraManager manager = (CameraManager)getSystemService(CAMERA_SERVICE);
try {
for (String cameraId : manager.getCameraIdList()) {
CameraCharacteristics chars = manager.getCameraCharacteristics(CameraId);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
2. 특징 가져오기
CameraCharacteristics 객체로 카메라에 대한 정보를 가져올 수 있다
// Does the camera have a forwards facing lens?
Integer facing = chars.get(CameraCharacteristics.LENS_FACING);
Surface View란?
일반적으로는 화면을 그릴 때 onDraw를 자동으로 호출해서 화면이 늦게 그려지고 내가 원하는 타이밍에 그릴 수 없다. 하지만 SurfaceView는 스레드를 이용해 내가 원하는 때 바로 화면에 그릴 수 있다.(그러므로 애니메이션, 게임과 같이 화면이 빠르게 변하는 작업을 할 때 적합하다) SurfaceView는 더블 버퍼링을 사용하여 SurfaceHolder에 미리 그림을 그리고 그걸 SurfaceView에 적용시킨다
Camera Tutorial Example
https://inducesmile.com/android/android-camera2-api-example-tutorial/
- CameraManager class는 Android 기기의 카메라를 관리하는데 사용됩니다
- 각 카메라 기기는 기기를 설명하는 설정과 특정 범위를 가지고 있습니다. 이것을 camera characteristics를 통해 얻을 수 있습니다
- 카메라 기기로 부터 캡쳐나 동영상을 찍는 것은, 앱은 반드시 맨 첫번째로 camera capture session을 생성해야 합니다
- 프리뷰나 캡쳐의 결과 Surface가 카메라 캡쳐는 필요합니다.다양한 classes, including SurfaceView, SurfaceTexture via Surface(SurfaceTexture), MediaCodec, MediaRecorder, Allocation, and ImageReader으로 부터 대상 Surface를 얻을 수 있습니다
- Application은 하나의 이미지 캡쳐를 위해 모든 parameter를 필요로 하는 CaptureRequest가 필요합니다
- 하나의 요청이 준비되면, 끝없이 반복하고 사용하거나 또는 하나의 캡쳐를 위해 각각 active capture session으로 넘깁니다
- 요청을 처리 한 후 카메라 장치는 캡처 시점의 카메라 장치 상태 및 사용 된 최종 설정에 대한 정보가 포함 된 TotalCaptureResult 객체를 생성합니다.
주요 Class
CameraManager : 디바이스의 카메라의 정보를 가지고 있다
CameraDevice : 현재 사용하는 카메라
CameraCaptureSession : 카메라에서 캡쳐된 이미지나 이전의 동일한 session에서 캡쳐한 이미지를 재 처리한다
CameraCharacteristics : CameraDevice의 속성. 불변이다
CaptureRequest : preview를 사용할 때 계속 capture를 요구
SurfaceTexture : OpenGL ES texture와 같은 image stream으로 부터 frame을 캡쳐한 결과물. 즉 이미지, 동영상의 캡쳐 결과물
CameraDevice.StateCallback : Camera Device의 상태를 업데이트 받기 위한 callback object. 시작, 종료, 에러 상태 등
CameraCaptureSession.CaptureCallback : Camera Device로 부터 완료된 CaptureRequest의 진행을 추적하기 위한 callback object. 캡쳐 완료 시 호출
ImageReader.OnImageAvailableListener : 새로운 이미지를 사용할 수 있을 때 호출. ImageReader로부터 사용할 수 있는 모든 새 frame에 대한 콜백
CameraCaptureSession.StateCallback : Camera capture session에 대한 상태가 변경되었을 때 호출됨
호출 순서
-
[CameraDevice.StateCallback] onOpened : 카메라가 켜짐. 하는 기기의 카메라의 Camera Device를 얻는다.
-
[createCameraPreview] : textureView의 버퍼 크기, textureView의 surface를 초기화한다. 그리고 Capture Session을 생성하는데 설정을 마쳤다면 CameraCaptureSession 상태 리스너의 onConfigured 함수를 호출한다.
-
[updatePreview] : preview를 업데이트 한다. 컨트롤 모드(a3)를 설정한다.여기까지가 세팅
-
[takePicture] : 이제부터 사진찍기 버튼을 눌렀을 때 순서이다. 현재 카메라 정보를 가져와서 저장할 이미지 정보를 세팅한다. 두개의 surfaceview를 생성하는데 하나는 imageReader, 다른 하나는 textureView의 것이다. 더블버퍼링 하는건가 싶음(내 추측)
-
[cameraDevice.createCaptureSession]onConfigured : 사진 정보 설정 완료
-
[captureListener]onCaptureCompleted : 카메라 캡쳐 완료. 또다시 preview를 업데이트한다
-
[createCameraPreview] : 카메라 preview 정보 업데이트
-
[takePicture]onImageAvailable : 이미지 저장. OnImageAvailableListener의 onImageAvailable 함수가 호출됨.
-
[updatePreview] : preview를 업데이트 한다.
'App > Android' 카테고리의 다른 글
Lambda expressions are not supported at language level '7' (0) | 2020.08.07 |
---|---|
Android Glide Library사용법 (0) | 2020.07.31 |
Android image 저장 (0) | 2020.07.22 |
갤러리에 이미지 저장 (0) | 2020.07.22 |
Android Image Path 가져오기 (0) | 2020.07.21 |