如何在Android中切换相机并显示预览

时间:2014-09-12 22:17:13

标签: java android camera

我一直在讨论这个问题,这是我需要完成的最后一件事,他的应用已经完成了。 基本上,我为我的应用程序创建了一个摄像头,我需要在onClick()上从后置摄像头切换到前置摄像头... 当我切换时,我丢失了预览...当我录制时,屏幕是黑色但视频被录制......但根本没有预览..这里是代码

@Override
protected void onCreate(Bundle saved) {
    super.onCreate(saved);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.camera);
    //some initializing code like checking flash, number of cameras...
    preview = (FrameLayout) findViewById(R.id.camera_preview);
}
@Override
public void onResume(){
    super.onResume();
    if (Camera.getNumberOfCameras() < 2) {
        a.id(R.id.camera_switch).clickable(false);
    }
    if(m!=null){
        m.reset();
        m.release();
        m=null;
        c.lock();
    }
    if (c != null) {
        c.release();
        c = null;
    }
    cam = "front";
    Instance();
}

public void Instance(){

    if(flash.equalsIgnoreCase("yes"))
        a.id(R.id.camera_flash).clickable(true);


    if(cam.equalsIgnoreCase("back")){
        try{
            m.reset();m=null;
            c.stopPreview();
            c.release();c.reconnect();
            c = null;

        }catch(Exception e){}
        a.id(R.id.camera_flash).clickable(false);
        Camera c = getCameraInstanceB(this);
        parameters = c.getParameters();
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        c.setParameters(parameters);
        cam = "front";
        try {
            c.setPreviewDisplay(mPreview.getHolder());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }c.startPreview();
    }else{
        try{

                c.release();
                c = null;

        }catch(Exception e){}
        c = getCameraInstance(this);
        parameters = c.getParameters();
        cam = "back";
    }
    m = new MediaRecorder();
    // Create our Preview view and set it as the content of our activity.
    mPreview = new CameraPreview(this, c);
    int orien =getResources().getConfiguration().orientation;
    if(orien ==1){
        parameters.setRotation(0); // set rotation to save the picture
        c.setDisplayOrientation(90);
        cam_rotation =90;
        parameters.setPictureSize(640, 480);
        PIC_ORIENTATION = "portrait";
        Toast.makeText(this, PIC_ORIENTATION, Toast.LENGTH_SHORT).show();
    }else{
        parameters.setRotation(0); // set rotation to save the picture
        c.setDisplayOrientation(0);
        parameters.setPictureSize(640, 480);
        PIC_ORIENTATION = "landscape";
        cam_rotation=0;
        Toast.makeText(this, PIC_ORIENTATION, Toast.LENGTH_SHORT).show();
    }
    c.setParameters(parameters);
    m.setCamera(c);
    preview.addView(mPreview);
}

现在背面和正面的相机实例

public static Camera getCameraInstance(Cam cam){
    c = null;
    try {
        c = Camera.open(CameraInfo.CAMERA_FACING_BACK); // attempt to get a Camera instance
        Camera.Parameters parameters = c.getParameters();
        parameters.setRecordingHint(true);
        parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
        c.setParameters(parameters);
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
        e.printStackTrace();
        text = "The camera is in use";
        //---set the data to pass back---
        data.putExtra("vid",text);
        cam.setResult(RESULT_OK, data);
         //---close the activity---
        cam.finish();
    }
    return c; // returns null if camera is unavailable
}
public static Camera getCameraInstanceB(Cam cam){
    c = null;
    try {
        c = Camera.open(CameraInfo.CAMERA_FACING_FRONT); // attempt to get a Camera instance
        Camera.Parameters parameters = c.getParameters();
        parameters.setRecordingHint(true);
        c.setParameters
        (parameters);
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
        e.printStackTrace();
        text = "The camera is in use";
        //---set the data to pass back---
        data.putExtra("vid",text);
        cam.setResult(RESULT_OK, data);
         //---close the activity---
        cam.finish();
    }
    return c; // returns null if camera is unavailable
}

on Resume()...一切都很好,但是当我切换...不再预览

1 个答案:

答案 0 :(得分:0)

花了好几个小时后,我终于提出了一个解决方案,基本上,我只是在每个开关上重新创建了SurfaceView,因为它是onStart();

public void Instance(){
preview = (FrameLayout) findViewById(R.id.camera_preview);
//rest of the code here

现在它就像一个魅力......即使在onResume上也没有错误