SPRING :: NOTE

[ANDROID] SURFACEVIEW를 이용하여 CAMERA 사용하기 #6 - 오토포커싱(autoFocusing) 본문

Development Language/JAVA · ANDROID

[ANDROID] SURFACEVIEW를 이용하여 CAMERA 사용하기 #6 - 오토포커싱(autoFocusing)

RAYZIE 2017. 6. 19. 18:30
반응형

[ANDROID] SURFACEVIEW를 이용하여 CAMERA 사용하기 #1

[ANDROID] SURFACEVIEW를 이용하여 CAMERA 사용하기 #2

[ANDROID] SURFACEVIEW를 이용하여 CAMERA 사용하기 #3 - 오버레이 추가

[ANDROID] SURFACEVIEW를 이용하여 CAMERA 사용하기 #4 - 촬영 기능 구현

[ANDROID] SURFACEVIEW를 이용하여 CAMERA 사용하기 #5 - 촬영된 이미지 저장


AndroidCamera App의 자동 초점(오토포커싱:Auto Focusing) 기능을 사용하려면 카메라 객체의 autoFocus() Method를 호출하고,

카메라의 포커스가 있을 때, 실행할 콜백 함수를 등록해야합니다.

이 Method는 SurfaceView를 이용하여 Camera View가 활성화 된 경우에만 동작합니다. (startPreview()와 stopPreview())


호출자는 이 Method가 호출되어야 하는지 판별하기 위해 getFocusMode()의 인자값을 판별해야 합니다.

카메라가 자동 초점을 지원하지 않으면 no-op이며, onAutoFocus(boolean, Camera) 콜백이 바로 호출됩니다.

Application은 오토포커싱 기능을 사용하기 위해 AndroidManifest.xml에 오토포커싱 권한(퍼미션)을 등록해야 합니다.

플래시 모드가 OFF가 아닌 경우, 드라이버 및 카메라 하드웨어에 따라 자동 초점 중 플레시가 터질 수 있습니다.


[ANDROID] SURFACEVIEW를 이용하여 CAMERA 사용하기 #5 - 촬영된 이미지 저장에 이어 

control.xml의 레이아웃 background에 대한 ID를 정의하세요.


사용자가 surfaceView를 터치할 때 마다 오토 포커싱 기능을 사용할 수 있습니다.


구현 이미지

control.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/background"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:gravity="bottom"
   >
<Button
 android:id="@+id/takepicture" 
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text=" * Take Picture "
 android:layout_gravity="right"
 android:layout_margin="10px"
 />
</LinearLayout>


AndroidCamera.java파일을 수정하여 camera.autoFocus(myAutoFocusCallback)을 호출하고,

AutoFocusCallback을 등록합니다.

AndroidCamera.java

package com.exercise.AndroidCamera;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;

import android.app.Activity;
import android.content.ContentValues;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Images.Media;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class AndroidCamera extends Activity implements SurfaceHolder.Callback{

 Camera camera;
 SurfaceView surfaceView;
 SurfaceHolder surfaceHolder;
 boolean previewing = false;
 LayoutInflater controlInflater = null;
 
 Button buttonTakePicture;
 
 final int RESULT_SAVEIMAGE = 0;
 
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
      
       getWindow().setFormat(PixelFormat.UNKNOWN);
       surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
       surfaceHolder = surfaceView.getHolder();
       surfaceHolder.addCallback(this);
       surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      
       controlInflater = LayoutInflater.from(getBaseContext());
       View viewControl = controlInflater.inflate(R.layout.control, null);
       LayoutParams layoutParamsControl
        = new LayoutParams(LayoutParams.FILL_PARENT,
        LayoutParams.FILL_PARENT);
       this.addContentView(viewControl, layoutParamsControl);
      
       buttonTakePicture = (Button)findViewById(R.id.takepicture);
       buttonTakePicture.setOnClickListener(new Button.OnClickListener(){

   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    camera.takePicture(myShutterCallback,
      myPictureCallback_RAW, myPictureCallback_JPG);
   }});
      
       LinearLayout layoutBackground = (LinearLayout)findViewById(R.id.background);
       layoutBackground.setOnClickListener(new LinearLayout.OnClickListener(){

   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub

    buttonTakePicture.setEnabled(false);
    camera.autoFocus(myAutoFocusCallback);
   }});
   }
  
   AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){

  @Override
  public void onAutoFocus(boolean arg0, Camera arg1) {
   // TODO Auto-generated method stub
   buttonTakePicture.setEnabled(true);
  }};
  
   ShutterCallback myShutterCallback = new ShutterCallback(){

  @Override
  public void onShutter() {
   // TODO Auto-generated method stub
   
  }};
  
 PictureCallback myPictureCallback_RAW = new PictureCallback(){

  @Override
  public void onPictureTaken(byte[] arg0, Camera arg1) {
   // TODO Auto-generated method stub
   
  }};
  
 PictureCallback myPictureCallback_JPG = new PictureCallback(){

  @Override
  public void onPictureTaken(byte[] arg0, Camera arg1) {
   // TODO Auto-generated method stub
   /*Bitmap bitmapPicture
    = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); */
   
   Uri uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());

   OutputStream imageFileOS;
   try {
    imageFileOS = getContentResolver().openOutputStream(uriTarget);
    imageFileOS.write(arg0);
    imageFileOS.flush();
    imageFileOS.close();
    
    Toast.makeText(AndroidCamera.this,
      "Image saved: " + uriTarget.toString(),
      Toast.LENGTH_LONG).show();
    
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

   camera.startPreview();
  }};

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
  // TODO Auto-generated method stub
  if(previewing){
   camera.stopPreview();
   previewing = false;
  }
  
  if (camera != null){
   try {
    camera.setPreviewDisplay(surfaceHolder);
    camera.startPreview();
    previewing = true;
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  camera = Camera.open();
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  camera.stopPreview();
  camera.release();
  camera = null;
  previewing = false;
 }
}


반응형
Comments