SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
Group & Android Dev | Soohwan, Ok
예제로배우는AndroidCamera2
카메라를 사용하는 유명한 앱들
방법1. 인텐트를 사용하여 다른 애플리케이션 호출하기
명시적/암시적 인텐트를 사용하여 다른 애플리케이션을 호출합니다.
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
@Override
protected void onActivityResult ( int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
imageView.setImageBitmap(imageBitmap);
}
}
Camera vs Camera2
android.hardware.camera
(since 2008, Android API 1 Level)
android.hardware.camera2
(since 2014, Android API 21)
플랫폼 별 점유율
카메라2가 할 수 있는 일들
- 수동조작 (ISO, 노출시간, 렌즈 촛점, 화이트 밸런스 등)
- RAW 포맷 지원
- Burst mode 지원
- 3개이상의 카메라에 접근
카메라2 핵심 구동 모델
- Per-setting control
- Single Request, multiple surfaces(up to 3)
- Multiple Requests and results in queue
simultaneosly
- Metadata returned back to the application as
requested separately
android-Camera2Basic
https://github.com/googlesamples/android-Camera2Basic
카메라 사용을 위한 프로젝트 설정하기
App level build.gradle
android{
…
defaultConfig{
minSdkVersion 21
…
}
}
AndroidManifest.xml
<manifest …>
<uses-permission android:name=“android.permission.CAMERA”/>
…
</manifest>
카메라 프리뷰로 TextureView를 사용
TextView는 콘텐트 스트림을 나타냅니다.
AutoFitTextureView 는 TextureView의 서브클래스로 가로/세로 비율을 알맞게 조정해줍니다.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.android.camera2basic.AutoFitTextureView
android:id="@+id/texture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
AutofitTextureView
SurfaceTexture 얻기
TextureView mTextureView = findViewById(R.id.texture);
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
private final TextureView.SurfaceTextureListener mSurfaceTextureListener
= new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) { … }
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) { … }
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) { return true; }
@Override
public void onSurfaceTextureUpdated(SurfaceTexture texture) {…}
};
SurfaceTexture는
OpenGL ES 텍스쳐로써 이미지 스트림으로부터 프레임을 캡쳐합니다.
Android graphics components
Camera2 용어
- CameraManager : 카메라 목록, 특성, 모니터링 등
- CameraDevice : 물리 카메라 표현, 캡쳐세션, 캡쳐리퀘스트 생성
- CameraCharacteristics : 카메라 특성 정보
- CameraCaptureSession : 카메라로부터 얻은 이미지를 Surface에 출력요청
- CaptureRequest : 카메라로부터 어떻게 이미지를 얻을지 결정
- CaptureResult : 카메라로부터 캡쳐한 결과
Camera2 Step By Step
CameraManager얻기 Camera 고르기 CameraDevice 얻기
Surface 얻기 캡쳐 세션 생성 캡쳐 리퀘스트 생성
CameraManager
CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
String[] cameraIds = manager.getCameraIdList();
CameraManager는 사용가능한 카메라들을 관리하고 제공합니다.
Camera2 Step By Step
CameraManager얻기 Camera 고르기 CameraDevice 얻기
Surface 얻기 캡쳐 세션 생성 캡쳐 세션 생성
CameraCharacteristics
for (String cameraId : manager.getCameraIdList()){
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
// 전면 카메라인지 확인
}
Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
mFlashSupported = available == null ? false : available;
// 플래시를 지원하는지 체크
…
}
CameraCharacteristics는 CameraDevice에 대한 메타데이터를 제공합니다.
카메라 등급(INFO_SUPPORTED_HARDWARE_LEVEL)
// 카메라가 특정레벨의 하드웨어 수준을 충족하면 true를 반환
boolean isHardwareLevelSupported(CameraCharacteristics c, int requiredLevel) {
final int[] sortedHwLevels = {
INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL,
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED, INFO_SUPPORTED_HARDWARE_LEVEL_FULL,
INFO_SUPPORTED_HARDWARE_LEVEL_3 };
int deviceLevel = c.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
if (requiredLevel == deviceLevel) {
return true;
}
for (int sortedlevel : sortedHwLevels) {
if (sortedlevel == requiredLevel) { return true; }
else if (sortedlevel == deviceLevel) { return false; }
}
return false; // Should never reach here
}
하나의 필드로 카메라의 하드웨어 지원 수준이 어느정도인지 제공합니다.
(LEGACY < LIMITED < FULL < LEVEL_3)
내가 원하는 카메라를 찾자!
StreamConfigurationMap map =
characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
// 사진찍는 용으로 가장 큰 해상도를 사용
Size largest = Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)),
new CompareSizesByArea());
…
mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class),
rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth,
maxPreviewHeight, largest);
StreamConfigurationMap은 다음과 같은 정보를 제공합니다
- 지원하는 이미지 사이즈 및 포맷
- 지원하는 비디오 사이즈와 FPS
- Minimum frame durations and stall durations
Camera2 Step By Step
CameraManager얻기 Camera 고르기 CameraDevice 얻기
Surface 얻기 캡쳐 세션 생성 캡쳐 리퀘스트 생성
카메라를 열고 CameraDevice객체를 얻자!
CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
카메라를 열기위해서는 Camera Id, StateCallback, Handler가 필요합니다
private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
// StateCallback is called when CameraDevice changes its state
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
// This method is called when the camera is opened. We start camera preview here.
mCameraDevice = cameraDevice;
createCameraPreviewSession();
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
//close the resources
}
@Override
public void onError(@NonNull CameraDevice cameraDevice, int error) {
//handle error and close resources
}
};
Camera2 Step By Step
CameraManager얻기 Camera 고르기 CameraDevice 얻기
Surface 얻기 캡쳐 세션 생성 캡쳐 리퀘스트 생성
텍스쳐뷰로 부터 얻은 SurfaceTexture로 Surface 만들기
SurfaceTexture texture = mTextureView.getSurfaceTexture();
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
// 프리뷰를 위한 Surface를 만듭니다.
Surface surface = new Surface(texture);
캡쳐세션을 만들기 전에 프리뷰를 위한 Surface를 준비합니다.
ImageReader로부터 Surface 얻기
ImageReader mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, 2);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
Surface surface = mImageReader.getSurface();
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener =
new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireNextImage();
…
// save a jpeg into the file here
image.close();
}
};
이 Surface는 나중에 사진을 찍기 위해 사용합니다.
Camera2 Step By Step
CameraManager얻기 Camera 고르기 CameraDevice 얻기
Surface 얻기 캡쳐 세션 생성하기 캡쳐 리퀘스트 생성
카메라 캡쳐 세션 생성하기
카메라 캡쳐세션을 생성하기 위해 아래의 메소드를 호출 합니다.
CameraDevice.createCaptureSession(List<Surface>, StateCallback, Handler)
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {...}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {…}
}, null
);
Camera2 Step By Step
CameraManager얻기 Camera 고르기 CameraDevice 얻기
Surface 얻기 캡쳐 세션 생성하기 캡쳐 리퀘스트 생성하기
프리뷰를 위한 캡쳐 리퀘스트 생성
CaptureRequest.Builder mPreviewRequestBuilder =
mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
…
mPreviewRequestBuilder.addTarget(surface);
CaptureRequest mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler);
사진을 찍기 위한 캡쳐 리퀘스트 생성
CaptureRequest.Builder captureBuilder =
mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());
…
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
실시간 이미지 프로세싱을 위한 프리뷰 버퍼 얻는 방법
ImageReader previewImageReader =
ImageReader.newInstance(width, hegith, ImageFormat.YUV_420_888, 1);
ImageReader.OnImageAvailableListener previewCallback = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
//image processing
image.close();
}
};
어렵고 복잡한 카메라를 쉽게!
- 유즈 케이스 기반으로 설계됨
- Lifecycle-aware
- Support effects. (Like Bokeh, HDR, Night and Beauty)
[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라

Contenu connexe

Tendances

Implémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaImplémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaRached Krim
 
Cours statistique descriptive
Cours statistique descriptiveCours statistique descriptive
Cours statistique descriptiveMouna Ettahiri
 
Cadre d’assurance qualité – Manuel de l’utilisateur
Cadre d’assurance qualité – Manuel de l’utilisateurCadre d’assurance qualité – Manuel de l’utilisateur
Cadre d’assurance qualité – Manuel de l’utilisateurHFG Project
 

Tendances (6)

Implémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En JavaImplémentation de l’algorithme du Simplexe En Java
Implémentation de l’algorithme du Simplexe En Java
 
Cours statistique descriptive
Cours statistique descriptiveCours statistique descriptive
Cours statistique descriptive
 
Planification
PlanificationPlanification
Planification
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Cadre d’assurance qualité – Manuel de l’utilisateur
Cadre d’assurance qualité – Manuel de l’utilisateurCadre d’assurance qualité – Manuel de l’utilisateur
Cadre d’assurance qualité – Manuel de l’utilisateur
 
Statistique epfc 2013 ch1_ch2
Statistique epfc 2013 ch1_ch2Statistique epfc 2013 ch1_ch2
Statistique epfc 2013 ch1_ch2
 

Similaire à [TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라

2019 Naver Tech Concert Android - Camera2
2019 Naver Tech Concert Android - Camera22019 Naver Tech Concert Android - Camera2
2019 Naver Tech Concert Android - Camera2SooHwan Ok
 
Surface flingerservice(서피스 플링거 연결)
Surface flingerservice(서피스 플링거 연결)Surface flingerservice(서피스 플링거 연결)
Surface flingerservice(서피스 플링거 연결)fefe7270
 
GA_GTM for Android_JuL
GA_GTM for Android_JuLGA_GTM for Android_JuL
GA_GTM for Android_JuLJi Ung Lee
 
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [전진 4드론] : RAD(Reinforcement learning method for ...
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [전진 4드론] : RAD(Reinforcement learning method for ...제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [전진 4드론] : RAD(Reinforcement learning method for ...
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [전진 4드론] : RAD(Reinforcement learning method for ...BOAZ Bigdata
 
React Hooks 마법. 그리고 깔끔한 사용기
React Hooks 마법. 그리고 깔끔한 사용기React Hooks 마법. 그리고 깔끔한 사용기
React Hooks 마법. 그리고 깔끔한 사용기NAVER SHOPPING
 
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
Vue.js 기초 실습.pptx
Vue.js 기초 실습.pptxVue.js 기초 실습.pptx
Vue.js 기초 실습.pptxwonyong hwang
 
Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)fefe7270
 
Python on Android
Python on AndroidPython on Android
Python on Android용 최
 
[26]자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test
[26]자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test[26]자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test
[26]자동화, 계륵에 살 붙이기 : Evolution of Android Automation TestNAVER Engineering
 
Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)fefe7270
 
유니티 데이드림 (DayDream) 튜토리얼
유니티 데이드림 (DayDream) 튜토리얼유니티 데이드림 (DayDream) 튜토리얼
유니티 데이드림 (DayDream) 튜토리얼Jemin Lee
 
MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 JaehoChoe3
 
[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridappNAVER D2
 
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발영욱 김
 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental systemJaehoon Oh
 
딥러닝을 이용한 사용자 선호도 기반 의상 추천 알고리즘 Ppt 선수강
딥러닝을 이용한 사용자 선호도 기반 의상 추천 알고리즘 Ppt 선수강딥러닝을 이용한 사용자 선호도 기반 의상 추천 알고리즘 Ppt 선수강
딥러닝을 이용한 사용자 선호도 기반 의상 추천 알고리즘 Ppt 선수강Minji Kang
 

Similaire à [TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라 (20)

2019 Naver Tech Concert Android - Camera2
2019 Naver Tech Concert Android - Camera22019 Naver Tech Concert Android - Camera2
2019 Naver Tech Concert Android - Camera2
 
Surface flingerservice(서피스 플링거 연결)
Surface flingerservice(서피스 플링거 연결)Surface flingerservice(서피스 플링거 연결)
Surface flingerservice(서피스 플링거 연결)
 
GA_GTM for Android_JuL
GA_GTM for Android_JuLGA_GTM for Android_JuL
GA_GTM for Android_JuL
 
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [전진 4드론] : RAD(Reinforcement learning method for ...
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [전진 4드론] : RAD(Reinforcement learning method for ...제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [전진 4드론] : RAD(Reinforcement learning method for ...
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [전진 4드론] : RAD(Reinforcement learning method for ...
 
React Hooks 마법. 그리고 깔끔한 사용기
React Hooks 마법. 그리고 깔끔한 사용기React Hooks 마법. 그리고 깔끔한 사용기
React Hooks 마법. 그리고 깔끔한 사용기
 
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
(자마린안드로이드예제실습)현재 위치를 얻은 후 지도에 표시하기, GPS다루기, 마시멜로이후 권한 획득방법 구현_추천자마린학원/자마린교육
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
Vue.js 기초 실습.pptx
Vue.js 기초 실습.pptxVue.js 기초 실습.pptx
Vue.js 기초 실습.pptx
 
Designing Apps for Motorla Xoom Tablet
Designing Apps for Motorla Xoom TabletDesigning Apps for Motorla Xoom Tablet
Designing Apps for Motorla Xoom Tablet
 
Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)Surface flingerservice(서피스 플링거 연결 jb)
Surface flingerservice(서피스 플링거 연결 jb)
 
Python on Android
Python on AndroidPython on Android
Python on Android
 
[26]자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test
[26]자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test[26]자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test
[26]자동화, 계륵에 살 붙이기 : Evolution of Android Automation Test
 
Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)Surface flingerservice(서피스 플링거 연결 ics)
Surface flingerservice(서피스 플링거 연결 ics)
 
2. xamarin.android 2.2 hello xamarin android 구조 2.2.7 simple intent example(현...
2. xamarin.android 2.2 hello xamarin android 구조 2.2.7 simple intent example(현...2. xamarin.android 2.2 hello xamarin android 구조 2.2.7 simple intent example(현...
2. xamarin.android 2.2 hello xamarin android 구조 2.2.7 simple intent example(현...
 
유니티 데이드림 (DayDream) 튜토리얼
유니티 데이드림 (DayDream) 튜토리얼유니티 데이드림 (DayDream) 튜토리얼
유니티 데이드림 (DayDream) 튜토리얼
 
MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 MVI on android Droid Knights 2020
MVI on android Droid Knights 2020
 
[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp
 
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental system
 
딥러닝을 이용한 사용자 선호도 기반 의상 추천 알고리즘 Ppt 선수강
딥러닝을 이용한 사용자 선호도 기반 의상 추천 알고리즘 Ppt 선수강딥러닝을 이용한 사용자 선호도 기반 의상 추천 알고리즘 Ppt 선수강
딥러닝을 이용한 사용자 선호도 기반 의상 추천 알고리즘 Ppt 선수강
 

Plus de NAVER Engineering

디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIX디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIXNAVER Engineering
 
진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)NAVER Engineering
 
서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트NAVER Engineering
 
BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호NAVER Engineering
 
이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라NAVER Engineering
 
날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기NAVER Engineering
 
쏘카프레임 구축 배경과 과정
 쏘카프레임 구축 배경과 과정 쏘카프레임 구축 배경과 과정
쏘카프레임 구축 배경과 과정NAVER Engineering
 
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기NAVER Engineering
 
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)NAVER Engineering
 
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드NAVER Engineering
 
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기NAVER Engineering
 
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활NAVER Engineering
 
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출NAVER Engineering
 
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우NAVER Engineering
 
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...NAVER Engineering
 
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법NAVER Engineering
 
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며NAVER Engineering
 
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기NAVER Engineering
 
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기NAVER Engineering
 

Plus de NAVER Engineering (20)

React vac pattern
React vac patternReact vac pattern
React vac pattern
 
디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIX디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIX
 
진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)
 
서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트
 
BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호
 
이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라
 
날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기
 
쏘카프레임 구축 배경과 과정
 쏘카프레임 구축 배경과 과정 쏘카프레임 구축 배경과 과정
쏘카프레임 구축 배경과 과정
 
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
 
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
 
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
 
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
 
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
 
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
 
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
 
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
 
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
 
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
 
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
 
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
 

[TECHCON 2019: MOBILE - Android]6.예제로 배우는 안드로이드 카메라

  • 1.
  • 2. Group & Android Dev | Soohwan, Ok 예제로배우는AndroidCamera2
  • 4. 방법1. 인텐트를 사용하여 다른 애플리케이션 호출하기 명시적/암시적 인텐트를 사용하여 다른 애플리케이션을 호출합니다. Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); @Override protected void onActivityResult ( int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); imageView.setImageBitmap(imageBitmap); } }
  • 5. Camera vs Camera2 android.hardware.camera (since 2008, Android API 1 Level) android.hardware.camera2 (since 2014, Android API 21)
  • 7. 카메라2가 할 수 있는 일들 - 수동조작 (ISO, 노출시간, 렌즈 촛점, 화이트 밸런스 등) - RAW 포맷 지원 - Burst mode 지원 - 3개이상의 카메라에 접근
  • 8. 카메라2 핵심 구동 모델 - Per-setting control - Single Request, multiple surfaces(up to 3) - Multiple Requests and results in queue simultaneosly - Metadata returned back to the application as requested separately
  • 10. 카메라 사용을 위한 프로젝트 설정하기 App level build.gradle android{ … defaultConfig{ minSdkVersion 21 … } } AndroidManifest.xml <manifest …> <uses-permission android:name=“android.permission.CAMERA”/> … </manifest>
  • 11. 카메라 프리뷰로 TextureView를 사용 TextView는 콘텐트 스트림을 나타냅니다. AutoFitTextureView 는 TextureView의 서브클래스로 가로/세로 비율을 알맞게 조정해줍니다. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.android.camera2basic.AutoFitTextureView android:id="@+id/texture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" /> </RelativeLayout>
  • 13. SurfaceTexture 얻기 TextureView mTextureView = findViewById(R.id.texture); mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); private final TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) { … } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) { … } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) { return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture texture) {…} }; SurfaceTexture는 OpenGL ES 텍스쳐로써 이미지 스트림으로부터 프레임을 캡쳐합니다.
  • 15. Camera2 용어 - CameraManager : 카메라 목록, 특성, 모니터링 등 - CameraDevice : 물리 카메라 표현, 캡쳐세션, 캡쳐리퀘스트 생성 - CameraCharacteristics : 카메라 특성 정보 - CameraCaptureSession : 카메라로부터 얻은 이미지를 Surface에 출력요청 - CaptureRequest : 카메라로부터 어떻게 이미지를 얻을지 결정 - CaptureResult : 카메라로부터 캡쳐한 결과
  • 16. Camera2 Step By Step CameraManager얻기 Camera 고르기 CameraDevice 얻기 Surface 얻기 캡쳐 세션 생성 캡쳐 리퀘스트 생성
  • 17. CameraManager CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); String[] cameraIds = manager.getCameraIdList(); CameraManager는 사용가능한 카메라들을 관리하고 제공합니다.
  • 18. Camera2 Step By Step CameraManager얻기 Camera 고르기 CameraDevice 얻기 Surface 얻기 캡쳐 세션 생성 캡쳐 세션 생성
  • 19. CameraCharacteristics for (String cameraId : manager.getCameraIdList()){ CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) { // 전면 카메라인지 확인 } Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); mFlashSupported = available == null ? false : available; // 플래시를 지원하는지 체크 … } CameraCharacteristics는 CameraDevice에 대한 메타데이터를 제공합니다.
  • 20. 카메라 등급(INFO_SUPPORTED_HARDWARE_LEVEL) // 카메라가 특정레벨의 하드웨어 수준을 충족하면 true를 반환 boolean isHardwareLevelSupported(CameraCharacteristics c, int requiredLevel) { final int[] sortedHwLevels = { INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL, INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED, INFO_SUPPORTED_HARDWARE_LEVEL_FULL, INFO_SUPPORTED_HARDWARE_LEVEL_3 }; int deviceLevel = c.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL); if (requiredLevel == deviceLevel) { return true; } for (int sortedlevel : sortedHwLevels) { if (sortedlevel == requiredLevel) { return true; } else if (sortedlevel == deviceLevel) { return false; } } return false; // Should never reach here } 하나의 필드로 카메라의 하드웨어 지원 수준이 어느정도인지 제공합니다. (LEGACY < LIMITED < FULL < LEVEL_3)
  • 21. 내가 원하는 카메라를 찾자! StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); // 사진찍는 용으로 가장 큰 해상도를 사용 Size largest = Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)), new CompareSizesByArea()); … mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth, maxPreviewHeight, largest); StreamConfigurationMap은 다음과 같은 정보를 제공합니다 - 지원하는 이미지 사이즈 및 포맷 - 지원하는 비디오 사이즈와 FPS - Minimum frame durations and stall durations
  • 22. Camera2 Step By Step CameraManager얻기 Camera 고르기 CameraDevice 얻기 Surface 얻기 캡쳐 세션 생성 캡쳐 리퀘스트 생성
  • 23. 카메라를 열고 CameraDevice객체를 얻자! CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); 카메라를 열기위해서는 Camera Id, StateCallback, Handler가 필요합니다 private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() { // StateCallback is called when CameraDevice changes its state @Override public void onOpened(@NonNull CameraDevice cameraDevice) { // This method is called when the camera is opened. We start camera preview here. mCameraDevice = cameraDevice; createCameraPreviewSession(); } @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { //close the resources } @Override public void onError(@NonNull CameraDevice cameraDevice, int error) { //handle error and close resources } };
  • 24. Camera2 Step By Step CameraManager얻기 Camera 고르기 CameraDevice 얻기 Surface 얻기 캡쳐 세션 생성 캡쳐 리퀘스트 생성
  • 25. 텍스쳐뷰로 부터 얻은 SurfaceTexture로 Surface 만들기 SurfaceTexture texture = mTextureView.getSurfaceTexture(); texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); // 프리뷰를 위한 Surface를 만듭니다. Surface surface = new Surface(texture); 캡쳐세션을 만들기 전에 프리뷰를 위한 Surface를 준비합니다.
  • 26. ImageReader로부터 Surface 얻기 ImageReader mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, 2); mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler); Surface surface = mImageReader.getSurface(); private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireNextImage(); … // save a jpeg into the file here image.close(); } }; 이 Surface는 나중에 사진을 찍기 위해 사용합니다.
  • 27. Camera2 Step By Step CameraManager얻기 Camera 고르기 CameraDevice 얻기 Surface 얻기 캡쳐 세션 생성하기 캡쳐 리퀘스트 생성
  • 28. 카메라 캡쳐 세션 생성하기 카메라 캡쳐세션을 생성하기 위해 아래의 메소드를 호출 합니다. CameraDevice.createCaptureSession(List<Surface>, StateCallback, Handler) mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {...} @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {…} }, null );
  • 29. Camera2 Step By Step CameraManager얻기 Camera 고르기 CameraDevice 얻기 Surface 얻기 캡쳐 세션 생성하기 캡쳐 리퀘스트 생성하기
  • 30. 프리뷰를 위한 캡쳐 리퀘스트 생성 CaptureRequest.Builder mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); … mPreviewRequestBuilder.addTarget(surface); CaptureRequest mPreviewRequest = mPreviewRequestBuilder.build(); mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler);
  • 31. 사진을 찍기 위한 캡쳐 리퀘스트 생성 CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(mImageReader.getSurface()); … mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
  • 32. 실시간 이미지 프로세싱을 위한 프리뷰 버퍼 얻는 방법 ImageReader previewImageReader = ImageReader.newInstance(width, hegith, ImageFormat.YUV_420_888, 1); ImageReader.OnImageAvailableListener previewCallback = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); //image processing image.close(); } };
  • 33. 어렵고 복잡한 카메라를 쉽게! - 유즈 케이스 기반으로 설계됨 - Lifecycle-aware - Support effects. (Like Bokeh, HDR, Night and Beauty)