시리즈

[번역]Camera2 이용해서 카메라 특징 조사

20190425
android
API
camera2
cameramanager

[번역]Camera2 이용해서 카메라 특징 조사

원문(Detecting camera features with Camera2)
내 스마트폰의 카메라는 그만의 특징을 가지고 있다. 플래쉬가 있고, 후면을 향해 있으며, 연속 촬영 (burst shot) 기능이 있으며, 심지어 내장형 소음 저감 기능도 있다.
개발자들은 이 특징들의 장점을 살려서 더 나은 사진 어플을 만들 수 있다.
하지만, 어떤 것들은 위 기능들이 없을 수 있고, 어쩌면 다른 추가 기능이 들어 있을 수도 있다.
개발자로서, 기기의 카메라에 어떤 기능이 있는지 알 수 있는 방법이 있을까?
그냥 Camera2에 물어보면 된다.

왜 Camera2 일까?

Camera2 API 는 Android L(API 21, Lollipop) 에서 소개되었고, 기존 Camera API를 계승하고 있다.
Camera2 카메라에 직접적으로 접근하는 강력한 사진 어플을 위해서 존재한다.
카메라가 그저 앱 사용을 돕는 보조도구로 사용된다면, 카메라 인텐트를 사용하는 편이 낫다.
하지만, 앱에 맞춤형 카메라 환경이 필요한 경우에는 Camera2 API가 옳은 선택이 될 것이다.
Camera2는 그 조상의 몇 가지 대단한 장점들을 그대로 가지고 있다.
  • 새로운 하드웨어에서 향상된 성능
  • 빠른 간격으로 이미지 촬영
  • 다중 카메라에서 미리보기 보여주기
  • 효과와 필터를 즉시 적용하기
이런 모든 장점들에 추가해서, API에 카메라에서 필요한 기능을 검색할 수 있습니다.

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);
위의 예시에서 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 링크 참조) 
  }
}
미션 완료. 이제 셀카를 찍는 사람은 작은 toast 창을 보게 될 거고, 전면 카메라로 아무 것도 못한다는 것을 알게 될 거다.

다른 기능들 조사하기

이 API를 이용해서 알아볼 수 있는게 또 있을까? 매우 많다.
CameraCharacteristic은 78개나 있다.
  • FLASH_INFO_AVAILABLE : 카메라에 플래쉬가 있는가?
  • REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE : 카메라가 고화질 사진을 20fps이상으로 찍을 수 있는가? (연속 촬영 모드)
  • JPEG_AVAILABLE_THUMBNAIL_SIZES: 이 장치에서 지원하는 JPEG 썸네일의 크기는?

Camera2 on Github

Camera2를 사용할 준비가 되면, 공식 Github 예제로 시작하는 것이 좋다. 예제에서는 더 나아가서 어떻게 사진을 찍고 미리보기 화면을 보는지를 다루고 있다.

.

piano (press key Q)

Categories

flutter ( 82 ) dart ( 34 ) android ( 32 ) kotlin ( 11 ) plugin ( 8 ) provider ( 8 ) vim ( 7 ) bloc ( 6 ) iOS ( 6 ) state management ( 6 ) 플러터 ( 6 ) PS ( 5 ) algorithm ( 5 ) architecture ( 5 ) async ( 5 ) getx ( 5 ) java ( 5 ) API ( 4 ) BOJ ( 4 ) class ( 4 ) daily ( 4 ) git ( 4 ) golang ( 4 ) memo ( 4 ) riverpod ( 4 ) state ( 4 ) stream ( 4 ) test ( 4 ) web ( 4 ) widget ( 4 ) windows ( 4 ) HTTP ( 3 ) androidX ( 3 ) app state ( 3 ) context ( 3 ) crash ( 3 ) db ( 3 ) editor ( 3 ) error ( 3 ) extension ( 3 ) github ( 3 ) hive ( 3 ) ide ( 3 ) package ( 3 ) pubspec ( 3 ) python ( 3 ) syntax ( 3 ) vscode ( 3 ) app icon ( 2 ) await ( 2 ) chocolatey ( 2 ) consumer ( 2 ) cp949 ( 2 ) deployment ( 2 ) dev ( 2 ) flavor ( 2 ) gesture ( 2 ) globalkey ( 2 ) go ( 2 ) google ( 2 ) hack ( 2 ) js ( 2 ) json ( 2 ) key ( 2 ) keystore ( 2 ) list ( 2 ) listview ( 2 ) lock ( 2 ) mac ( 2 ) map ( 2 ) navigation ( 2 ) nosql ( 2 ) project ( 2 ) pub ( 2 ) recyclerview ( 2 ) rxdart ( 2 ) sdk ( 2 ) selector ( 2 ) setting ( 2 ) size ( 2 ) soc ( 2 ) synchronized ( 2 ) tdd ( 2 ) tip ( 2 ) version ( 2 ) viewmodel ( 2 ) vundle ( 2 ) webview ( 2 ) xcode ( 2 ) yaml ( 2 ) ( 2 ) 플러터 단점 ( 2 ) 16.0 ( 1 ) 2.0 ( 1 ) 2023 ( 1 ) AATP2 ( 1 ) ChangeNotifierProvider ( 1 ) Example ( 1 ) Guava ( 1 ) ImageReader ( 1 ) Mo's algorithm ( 1 ) OAuth2 ( 1 ) OpenGL ( 1 ) Oreo ( 1 ) ProgressBar ( 1 ) REST API ( 1 ) Trie ( 1 ) activity ( 1 ) adaptive ( 1 ) android P ( 1 ) android context ( 1 ) android11 ( 1 ) apktool2 ( 1 ) app exit ( 1 ) append ( 1 ) appicon ( 1 ) arkit ( 1 ) array ( 1 ) asciidoc ( 1 ) async * ( 1 ) async* ( 1 ) audio ( 1 ) authorization ( 1 ) await for ( 1 ) behaviorsubject ( 1 ) beta ( 1 ) binary ( 1 ) binarysearch ( 1 ) blender ( 1 ) book ( 1 ) bottomsheet ( 1 ) break ( 1 ) broadcast ( 1 ) browser ( 1 ) bubbles ( 1 ) bug ( 1 ) build ( 1 ) buildcontext ( 1 ) buildnumber ( 1 ) bundle ( 1 ) button ( 1 ) bytecode ( 1 ) cache ( 1 ) camera2 ( 1 ) cameramanager ( 1 ) cd ( 1 ) chrome ( 1 ) ci ( 1 ) circle ( 1 ) clean ( 1 ) clean architecture ( 1 ) cli ( 1 ) clip ( 1 ) clipboard ( 1 ) cloud ide ( 1 ) cmdlet ( 1 ) code ( 1 ) coding test ( 1 ) command ( 1 ) comparator ( 1 ) complexity ( 1 ) concurrency ( 1 ) conditional ( 1 ) const ( 1 ) constraint ( 1 ) constraintlayout ( 1 ) controlc ( 1 ) controlv ( 1 ) converter ( 1 ) copy ( 1 ) copy project ( 1 ) coupling ( 1 ) coverage ( 1 ) cp ( 1 ) css ( 1 ) cupertino ( 1 ) cursor ( 1 ) cv ( 1 ) data class ( 1 ) data structure ( 1 ) dataBinding ( 1 ) database ( 1 ) debounce ( 1 ) decompile ( 1 ) delegate ( 1 ) deno ( 1 ) design pattern ( 1 ) development ( 1 ) device ( 1 ) di ( 1 ) dialog ( 1 ) dio ( 1 ) drawable ( 1 ) drug ( 1 ) emmet ( 1 ) encoding ( 1 ) english ( 1 ) entries ( 1 ) environment ( 1 ) equality ( 1 ) equatable ( 1 ) euc-kr ( 1 ) euckr ( 1 ) exit ( 1 ) expand ( 1 ) expanded ( 1 ) export ( 1 ) extension method ( 1 ) facade ( 1 ) fake ( 1 ) field ( 1 ) figma ( 1 ) final ( 1 ) fixed ( 1 ) flutter pub ( 1 ) flutter web ( 1 ) flutter_inappwebview ( 1 ) flutter_test ( 1 ) flutterflow ( 1 ) fold ( 1 ) fonts ( 1 ) form ( 1 ) frame ( 1 ) future ( 1 ) gestureDetector ( 1 ) gestureRecognizer ( 1 ) gesturearena ( 1 ) get-command ( 1 ) get_cli ( 1 ) getbuilder ( 1 ) getx단점 ( 1 ) gitignore ( 1 ) glut ( 1 ) google fonts ( 1 ) gopath ( 1 ) goto ( 1 ) gradient ( 1 ) graphics ( 1 ) gvim ( 1 ) hackaton ( 1 ) hash ( 1 ) hashmap ( 1 ) hot reload ( 1 ) how to ( 1 ) html ( 1 ) i18n ( 1 ) icon ( 1 ) id ( 1 ) impeller ( 1 ) implementation ( 1 ) import ( 1 ) indicator ( 1 ) inkwell ( 1 ) interrupt ( 1 ) intl ( 1 ) introduction ( 1 ) io ( 1 ) isar ( 1 ) iterable ( 1 ) iteration ( 1 ) javascript ( 1 ) julia ( 1 ) juno ( 1 ) jupyter ( 1 ) kakaomap ( 1 ) keytool ( 1 ) korean ( 1 ) kotlin syntax ( 1 ) l10n ( 1 ) lambda ( 1 ) language ( 1 ) layer ( 1 ) layout ( 1 ) lineageOS ( 1 ) localkey ( 1 ) localtoglobal ( 1 ) long list ( 1 ) ls ( 1 ) mac osx ( 1 ) markdown ( 1 ) markup ( 1 ) material ( 1 ) method ( 1 ) microtask ( 1 ) migrate ( 1 ) mintlify ( 1 ) mock ( 1 ) module ( 1 ) monitor ( 1 ) moor ( 1 ) mouse ( 1 ) mouseregion ( 1 ) multiplatform ( 1 ) multiset ( 1 ) multithread ( 1 ) mutable ( 1 ) mvvm ( 1 ) new ( 1 ) node ( 1 ) nodejs ( 1 ) nosuchmethod ( 1 ) null-safety ( 1 ) numberformat ( 1 ) nvim ( 1 ) object ( 1 ) objectbox ( 1 ) objectkey ( 1 ) obx ( 1 ) online ide ( 1 ) operator ( 1 ) orientation ( 1 ) parabeac ( 1 ) parse ( 1 ) paste ( 1 ) path ( 1 ) pattern ( 1 ) pitfall ( 1 ) play store ( 1 ) pod ( 1 ) podfile ( 1 ) pointer ( 1 ) pointers ( 1 ) powershell ( 1 ) private ( 1 ) programming ( 1 ) pull to refresh ( 1 ) puzzle ( 1 ) pycharm ( 1 ) realitykit ( 1 ) recursion ( 1 ) reduce ( 1 ) reference ( 1 ) regex ( 1 ) regular expression ( 1 ) release note ( 1 ) renderbox ( 1 ) renderobject ( 1 ) repl ( 1 ) repository ( 1 ) response ( 1 ) rm ( 1 ) rotue ( 1 ) round ( 1 ) run ( 1 ) scope ( 1 ) scroll ( 1 ) search ( 1 ) server ( 1 ) serverless ( 1 ) service ( 1 ) sharp ( 1 ) singlerepo ( 1 ) singleton ( 1 ) sketch ( 1 ) sliver ( 1 ) sliverlist ( 1 ) snippets ( 1 ) sogae ( 1 ) sorting ( 1 ) source ( 1 ) sparse ( 1 ) sparse array ( 1 ) spec ( 1 ) split ( 1 ) sqflite ( 1 ) sqlite ( 1 ) sqrt decomposition ( 1 ) stateful ( 1 ) statefulwidget ( 1 ) step ( 1 ) stepper ( 1 ) string ( 1 ) stringbuffer ( 1 ) stringbuilder ( 1 ) studio ( 1 ) study ( 1 ) sub-directory ( 1 ) svn ( 1 ) swiftui ( 1 ) swipe to refresh ( 1 ) system_alert_window ( 1 ) system_cache ( 1 ) systemnavigator ( 1 ) tail recursion ( 1 ) tailrec ( 1 ) tap test ( 1 ) text ( 1 ) texteditingcontroller ( 1 ) textfield ( 1 ) texttheme ( 1 ) themedata ( 1 ) then ( 1 ) thread ( 1 ) throttle ( 1 ) time ( 1 ) tool ( 1 ) tools ( 1 ) tooltip ( 1 ) ts ( 1 ) tutorial ( 1 ) typescript ( 1 ) ui ( 1 ) unittest ( 1 ) update ( 1 ) usb ( 1 ) utf8 ( 1 ) ux ( 1 ) valuekey ( 1 ) variable ( 1 ) vector ( 1 ) versioncode ( 1 ) very_good ( 1 ) view ( 1 ) vim plugin ( 1 ) vimrc ( 1 ) virtualenv ( 1 ) wasm ( 1 ) web app ( 1 ) webview_flutter ( 1 ) while ( 1 ) widget tree ( 1 ) window ( 1 ) wsl ( 1 ) yield ( 1 ) 강의 ( 1 ) 개발 ( 1 ) 개발 공부 ( 1 ) 공부법 ( 1 ) 그래픽스 ( 1 ) 꼬리재귀 ( 1 ) 꿀팁 ( 1 ) 데노 ( 1 ) 두줄 ( 1 ) 디노 ( 1 ) 번역 ( 1 ) 블록 ( 1 ) 상태관리 ( 1 ) 실험 ( 1 ) 안드로이드 ( 1 ) 안드로이드프로젝트 ( 1 ) 안드로이드프로젝트복사 ( 1 ) 어이없는 ( 1 ) 조건부 임포트 ( 1 ) 주절주절분노조절실패의식으흐름 ( 1 ) 패키지 ( 1 ) 프로젝트복사 ( 1 ) 플러그인 ( 1 )