package com.naver.AdnroidCameraSwitch;

import java.io.IOException;
import java.util.List;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class AndroidCameraSwitchActivity extends Activity {
    /** Called when the activity is first created. */
 
 private SurfaceView preView = null;
 private SurfaceHolder preViewHolder = null;
 private Camera camera = null;
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initPreView();
        initCamera();
       
       ((Button)findViewById(R.id.switchButton)).setOnClickListener(new OnClickListener() {
  
  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   cameraSwitch();
  }
 });
    }
   
   
    public void initPreView()
    {
     preView = (SurfaceView)findViewById(R.id.CamerasurfaceView);
     preViewHolder = preView.getHolder();
     preViewHolder.addCallback(CreateSurfaceHolder());
     preViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     
     
    }
   
    public void initCamera()
    {
     
     camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);

     camera.startPreview();
    }
   
    public void cameraSwitch()
    {
     
     if(camera != null)
  {

      camera.stopPreview();
      preViewHolder.addCallback(null);
      camera.release();
      camera = null;
      camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
      camera.startPreview();
  }
    }
   
    public SurfaceHolder.Callback CreateSurfaceHolder()
    {

        SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
            public void surfaceCreated(SurfaceHolder holder) {
                // no-op -- wait until surfaceChanged()
             
             try {
        camera.setPreviewDisplay(holder);
       } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
             int a = 0;
             a = a+ 1;
            }
        
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
             Camera.Parameters parameters = camera.getParameters();
             
             List<Camera.Size> previewSuppertedSizes = parameters.getSupportedPreviewSizes();
             Camera.Size previewSize = previewSuppertedSizes.get(0);
             parameters.setPreviewSize(previewSize.width,previewSize.height);
                camera.setParameters(parameters);
                camera.startPreview();
             
               int a = 0;
             a = a+ 1;
            }
        
            public void surfaceDestroyed(SurfaceHolder holder) {
    
            }
        };
        return surfaceCallback;
    }

   
}

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
    <SurfaceView
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:id="@+id/CamerasurfaceView"/>
    <Button android:layout_width="300dip"
         android:layout_height="300dip"
         android:id="@+id/switchButton"/>

</FrameLayout >

 

위와 같이 코딩을 하였습니다 .처음 시작할때는 카메라 프리뷰가 보입니다 하지만 cameraSwitch()함수를 호출하여 프리뷰 화면이 정지 상태에 있습니다. 이유는 제 생각에는 surfaceCreated,surfaceChanged 함수들이 호출이 안되는 문제 인것같습니다, 어떻게 하면 surfaceCreated,surfaceChanged를 함수를 호출되게 할수있을까요?