IT/안드로이드+JAVA

[안드로이드] 카메라 앞, 뒤 전환

안경 쓴 귀니 2016. 9. 28. 15:45
반응형





[안드로이드] 카메라 앞, 뒤 전환하기





    카메라 촬영 기능에서 전면 카메라, 후면 카메라 전환 기능이 필요해서 만든 소스다. 


    CAMERA_FACING_BACK, CAMERA_FACING_FRONT 값만 설정해서 SurfaceView를 새로 만들기만 하면 되기때문에, 카메라 전환 기능 자체는 구현하기 어렵지 않았다. 다만 최초 1회 카메라 전환 기능이 동작한 이후 다시 버튼을 누르면 OnClick 리스너가 동작하지 않아 당황했는데, SurfaceView를 새로 만들면서 setContentView를 다시 했기 때문에 기존의 리스너 설정도 다 날아가는 모양이다. 그래서 버튼들에 대한 OnClickListener들도 다시 설정하도록 했는데, 이렇게 하는 것이 맞는 것인지 아니면 다른 효과적인 방법이 있는데 내가 모르는 것인지는...^^;; 어쨌든 동작은 잘 된다;; 


public class CameraActivity extends Activity {

private CameraView mCamView; // 카메라 프리뷰를 보여주는 SurfaceView private Button btnCapture; // '촬영' 버튼 private Button btnCancel; // '취소' 버튼 (현재 액티비티 종료) private Button btnChangeFacing; // '카메라 전환' 버튼 private int mCameraFacing; // 전면 or 후면 카메라 상태 저장 private static CameraActivity me; // CameraView에서 Activity.finish()로 액티비티를 종료시키기 위한 변수 @Override

protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     me = this;     mCameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK; // 최초 카메라 상태는 후면카메라로 설정  

    // '카메라 전환' 버튼을 선택하여 카메라를 새로 생성하면 

     // contentView 설정과 Listener 설정 역시 다시 해주어야 하므로,

     // 해당 부분들을 init()메소드로 빼내어 onClick()에서 재호출하도록 함     init();     } private void init() {             mCamView = new CameraView(me, mCameraFacing);             setContentView(mCamView);             addContentView(LayoutInflater.from( me ).inflate( R.layout.camera_activity, null), 

new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT ));             btnCapture = (Button) findViewById(R.id.button_capture);             btnCapture.setOnClickListener(new OnClickListener(){                 @Override                 public void onClick(View arg0) {                     mCamView.capture();                 }             });             btnCancel = (Button) findViewById(R.id.button_cancel);     btnCancel.setOnClickListener(new OnClickListener(){ @Override     public void onClick(View arg0) { CameraActivity.exitCamera(); }     });     btnChangeFacing = (Button) findViewById(R.id.button_change_facing);     btnChangeFacing.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) {

     // 전면 -> 후면 or 후면 -> 전면으로 카메라 상태 전환     mCameraFacing = (mCameraFacing==Camera.CameraInfo.CAMERA_FACING_BACK) ?                 Camera.CameraInfo.CAMERA_FACING_FRONT 

: Camera.CameraInfo.CAMERA_FACING_BACK;

// 변경된 방향으로 새로운 카메라 View 생성     mCamView = new CameraView(me, mCameraFacing);


// ContentView, Listener 재설정

init(); } });     }     public static void exitCamera(){ me.finish();     } } class CameraView extends SurfaceView implements SurfaceHolder.Callback {     private static SurfaceHolder mHolder;     private static Camera mCamera;     private static int mCameraFacing;     public CameraView(Context context, int cameraFacing) { super(context);

mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mCameraFacing = cameraFacing;     }     @Override     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {      mCamera.startPreview();     }     @Override     public void surfaceCreated(SurfaceHolder arg0) { try     {

 mCamera = Camera.open(mCameraFacing); Parameters parameters = mCamera.getParameters();     parameters.set("jpeg-quality", 70); parameters.setPictureFormat(PixelFormat.JPEG); parameters.setPictureSize(640, 480); mCamera.setParameters(parameters); mCamera.setPreviewDisplay(mHolder);  } catch(IOException e) {     mCamera.release();     mCamera = null;     e.printStackTrace(System.out); } } @Override public void surfaceDestroyed(SurfaceHolder holder) {     mCamera.stopPreview();     mCamera.release(); mCamera = null; } public void capture(){     if(mCamera!=null)         mCamera.takePicture(shutterCallback, rawCallback, jpegCallback); } ShutterCallback shutterCallback = new ShutterCallback() {     public void onShutter () {     } }; PictureCallback rawCallback = new PictureCallback(){     public void onPictureTaken(byte[] data, Camera camera){     } }; PictureCallback jpegCallback = new PictureCallback(){     public void onPictureTaken(final byte[] data, Camera camera){         mCamera.stopPreview(); new Thread(new Runnable(){      @Override      public void run() { BufferedOutputStream bos = null; try{      bos = new BufferedOutputStream                                     (new FileOutputStream((String.format("capture.jpg", 

                                                                        System.currentTimeMillis()))));      bos.write(data); bos.close(); } catch(IOException e){ e.printStackTrace(); } } }).start(); CameraActivity.exitCamera(); } }; }


[ 출처 : http://danha.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EC%A0%84%ED%99%98Camera-toggling-Front-or-back ]

반응형