繁体   English   中英

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

[英]How to switch camera in android and show the preview

我一直在解决这个问题,这是我需要完成的最后一件事,他的应用程序已经完成。 基本上,我为我的应用创建了一个摄像头,我需要在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
}

在Resume()上...一切都很好,但是当我切换时...没有更多预览

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

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

现在它就像一个咒语一样工作...即使在onResume上也没有错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM