Nuke Olaf - Log Store

[Android] 안드로이드 - camera2 api를 이용해서 사진 찍기 본문

Android

[Android] 안드로이드 - camera2 api를 이용해서 사진 찍기

NukeOlaf 2019. 12. 13. 14:14

camera2 는 2014년 도입된 api 이다. Android 에서는 더이상 camera2 이전의 camera api 를 지원하지 않기 때문에 장치 카메라를 사용하는 모든 새로 개발된 앱은 camera2 api 를 사용해야한다.

 

camera2 api 를 지원하지 않는 구형 스마트폰이 아니라면 camera2 를 사용해야 한다.

 

1. 매니페스트에 권한 선언하기

<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

2. TextureView 생성하기

TextureView 는 카메라 미리보기를 랜더링하기 위한 placeholder 이다. TextureView 대신 SurfaceView 를 사용할 수 있지만, SurfaceView 는 scaling and shear and animations와 같은 기능을 지원하지 않는다.

 

카메라 미리보기를 TextureView 로 랜더링 하기 위해서는 getSurfaceTexture 를 호출하거나, TextureView.SurfaceListener 의 onSurfaceTextureAvailable() 을 듣고 TextureView 의 SurfaceTexture 를 구성하고, 리스너가 제공한 SurfaceTexture 를 사용하여 미리보기를 랜더링할 수 있다. SurfaceTexture 는 TextureView 가 화면에 연결된 경우에만 사용할 수 있으므로 리스너 메서드를 사용하는 것이 좋다.

 

private TextureView.SurfaceTextureListener surfaceTextureListener = new TextureView.SurfaceTextureListener() {

        @Override

        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {

            openCamera();

        }

 

        @Override

        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

        }

 

        @Override

        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

            return false;

        }

 

        @Override

        public void onSurfaceTextureUpdated(SurfaceTexture surface) {

        }

    };

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_camera);

 

        mTextureView = (TextureView) findViewById(R.id.texture);

        mTextureView.setSurfaceTextureListener(surfaceTextureListener);

    }

 

textureViewListener 의 onSurfaceTextureAvailable (), 즉 surfaceTexture 이 사용가능하면 openCamera() 메서드를 호출하도록 한다.

3. openCamera() 메서드 정의하기

이제 openCamera() 메서드를 정의해주어야 한다.

카메라를 열기 위해서는 getSystemService() 를 호출하여 CameraManager 의 인스턴스를 얻어야 한다. CameraManager 는 카메라에 접근하거나 카메라의 특징을 얻어올 수 있는 객체이다. getCameraId() 를 사용하여 CameraManger 객체로부터 사용 가능한 카메라 idList 를 가져온다. 

 

 

http://www.marko-jovanovic.de/en/

Comments