[번역]Camera2 이용해서 카메라 특징 조사
원문(Detecting camera features with Camera2)내 스마트폰의 카메라는 그만의 특징을 가지고 있다. 플래쉬가 있고, 후면을 향해 있으며, 연속 촬영 (burst shot) 기능이 있으며, 심지어 내장형 소음 저감 기능도 있다.
개발자들은 이 특징들의 장점을 살려서 더 나은 사진 어플을 만들 수 있다.
하지만, 어떤 것들은 위 기능들이 없을 수 있고, 어쩌면 다른 추가 기능이 들어 있을 수도 있다.
개발자로서, 기기의 카메라에 어떤 기능이 있는지 알 수 있는 방법이 있을까?
그냥 Camera2에 물어보면 된다.
왜 Camera2 일까?
Camera2 API 는 Android L(API 21, Lollipop) 에서 소개되었고, 기존 Camera API를 계승하고 있다.Camera2 카메라에 직접적으로 접근하는 강력한 사진 어플을 위해서 존재한다.
카메라가 그저 앱 사용을 돕는 보조도구로 사용된다면, 카메라 인텐트를 사용하는 편이 낫다.
하지만, 앱에 맞춤형 카메라 환경이 필요한 경우에는 Camera2 API가 옳은 선택이 될 것이다.
Camera2는 그 조상의 몇 가지 대단한 장점들을 그대로 가지고 있다.
- 새로운 하드웨어에서 향상된 성능
- 빠른 간격으로 이미지 촬영
- 다중 카메라에서 미리보기 보여주기
- 효과와 필터를 즉시 적용하기
Camera2로 셀카 못 찍게 만들기 (Banning Selfies with Camera2)
이제 셀카 금지 어플을 만든다고 해보자. 유저가 전면 카메라를 사용하려고 하면, 그러면 안된다고 토스트를 띄워주면 된다.Camera2 API는 전면 카메라가 존재하는지 알고 있다, 먼저 스마트폰에서 사용 가능한 모든 카메라의 목록이 필요하다.
Step 1: 카메라 가져오기
Camera2 API 의 핵심 조각은 CameraManager 클래스다.CameraManager에 있는 getCameraIdList() 를 호출해서 카메라의 id들을 문자열 배열로 가져올 수 있다. 카메라 id는 장치에서 사용 가능한 카메라 하나를 대표한다.
getCameraCharactertics() 메소드를 사용해서, 카메라 id를 전달하고 가능한 설정들과 장치를 위한 출력 매개변수들을 가져올 수 있다.
CameraManager manager = (CameraManager)getSystemService(CAMERA_SERVICE); try { for (String cameraId : manager.getCameraIdList()) { CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId); // Do something with the characteristics } } catch (CameraAccessException e) { e.printStackTrace(); }
Step 2: 특성 쿼리하기
한번 CameraCharacteristics 객체를 얻었다면, 이제 장치에서 사용 가능한 특성들에 대한 쿼리를 할 수 있다. get() 메소드는 CameraCharacteristic 필드가 필요하고, 그 필드의 값을 반환해준다.// 카메라가 어디를 향하고 있는가? Integer facing = chars.get(CameraCharacteristics.LENS_FACING);
Step 3: 셀카 금지하기
facing 변수는 단지 정수일 뿐이다. facing이 어느 방향을 나타내는지 어떻게 알 수 있을까? 정수값은 CameraMetadata 상수를 나타낸다. LENS_FACING_FRONT 상수를 사용하면 렌즈가 앞 쪽을 향하고 있는지를 확인 할 수 있다.private void detectSelfieCamera(String cameraId) { CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId); // 카메라 렌즈가 향하고 있는 방향은? Integer facing = chars.get(CameraCharacteristics.LENS_FACING); if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) { // 셀카 금지 ! Context context = getApplicationContext(); CharSequence text = “No selfie for you! Turn the camera around”; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration) toast.show(); // 전면 카메라는 아무런 일도 하지 않는다. continue; } else { // 후면 카메라를 연다. (아래 github 링크 참조) } }
다른 기능들 조사하기
이 API를 이용해서 알아볼 수 있는게 또 있을까? 매우 많다.CameraCharacteristic은 78개나 있다.
- FLASH_INFO_AVAILABLE : 카메라에 플래쉬가 있는가?
- REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE : 카메라가 고화질 사진을 20fps이상으로 찍을 수 있는가? (연속 촬영 모드)
- JPEG_AVAILABLE_THUMBNAIL_SIZES: 이 장치에서 지원하는 JPEG 썸네일의 크기는?