摄像机之间的Andr​​oid摄像头preVIEW开关 [英] Android Camera Preview Switch between cameras

查看:201
本文介绍了摄像机之间的Andr​​oid摄像头preVIEW开关的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我试图同时显示相机preVIEW设备的正面和背面摄像头之间切换。我下面的示例通过普通洁具提供。下面是我使用的code,每当我点击翻转按钮的表面观变黑,我不知道我错了。请帮我解决这个问题。我搜索关于这一点,我没有得到任何合适的答案为一些试图重新启动当前活动,但我不想这样。希望能得到更好的响应。在此先感谢。

 包com.commonsware.android.camera;
进口android.app.Activity;
进口android.hardware.Camera;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;
进口android.widget.CompoundButton;
进口android.widget.CompoundButton.OnCheckedChangeListener;
进口android.widget.Toast;
进口android.widget.ToggleButton;
公共类previewDemo延伸活动{
    私人SurfaceView preVIEW = NULL;
    私人SurfaceHolder previewHolder = NULL;
    私人相机拍照= NULL;
    私人布尔在preVIEW = FALSE;
    私人布尔cameraConfigured = FALSE;
    私人切换按钮flipCamera;

@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);

    的setContentView(R.layout.main);
    flipCamera =(切换按钮)findViewById(R.id.flip);
    preVIEW =(SurfaceView)findViewById(R.id. preVIEW);
    previewHolder = preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    flipCamera.setOnCheckedChangeListener(新OnCheckedChangeListener(){

        @覆盖
        公共无效onCheckedChanged(CompoundButton buttonView,
                布尔器isChecked){
            // TODO自动生成方法存根
            重新启动preVIEW(器isChecked);
        }
    });

}

@覆盖
公共无效onResume(){
    super.onResume();

    //相机= Camera.open();
    INT CAMID = Camera.CameraInfo.CAMERA_FACING_BACK;
    如果(Camera.getNumberOfCameras()大于1
            &功放;&安培; CAMID< Camera.getNumberOfCameras() -  1){
        // startCamera(CAMID + 1);
        相机= Camera.open(CAMID + 1);
    } 其他 {
        // startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
        摄像头= Camera.open(CAMID);
    }
    启动preVIEW();
}

无效重启preVIEW(布尔isFront){
    如果(在preVIEW){
        camera.stop preVIEW();
    }
    //
    camera.release();

    //摄像头= NULL;
    //在preVIEW = FALSE;
    // / * INT CAMID = Camera.CameraInfo.CAMERA_FACING_BACK;
    //如果(Camera.getNumberOfCameras()→1&安培;&安培; CAMID&其中;
    // Camera.getNumberOfCameras() -  1){
    // // startCamera(CAMID + 1);
    //相机= Camera.open(CAMID + 1);
    // } 其他 {
    // //startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
    //摄像头= Camera.open(CAMID);
    //} * /
    INT CAMID = Camera.CameraInfo.CAMERA_FACING_BACK;
    如果(isFront){
        摄像头= Camera.open(CAMID);
        camera.start preVIEW();

    } 其他 {
        相机= Camera.open(CAMID + 1);
        camera.start preVIEW();

    }
    //启动preVIEW();
}

@覆盖
公共无效的onPause(){
    如果(在preVIEW){
        camera.stop preVIEW();
    }

    camera.release();
    摄像头= NULL;
    在preVIEW = FALSE;

    super.onPause();
}

私人Camera.Size getBest previewSize(INT宽度,高度INT,
        Camera.Parameters参数){
    Camera.Size结果= NULL;

    对于(Camera.Size大小:parameters.getSupported previewSizes()){
        如果(size.width< =宽度放大器;&安培; size.height< =身高){
            如果(结果== NULL){
                结果=大小;
            } 其他 {
                INT resultArea = result.width * result.height;
                INT newArea = size.width * size.height;

                如果(newArea> resultArea){
                    结果=大小;
                }
            }
        }
    }

    返回(结果);
}

私人无效的init preVIEW(INT宽度,高度INT){
    如果(相机= NULL和放大器;!&安培;!previewHolder.getSurface()= NULL){
        尝试 {
            camera.set previewDisplay(previewHolder);
        }赶上(的Throwable T){
            Log.e(previewDemo-surfaceCallback
                    异常的一套previewDisplay(),T);
            Toast.makeText(previewDemo.this,t.getMessage()
                    Toast.LENGTH_LONG).show();
        }

        如果(!cameraConfigured){
            Camera.Parameters参数= camera.getParameters();
            Camera.Size大小= getBest previewSize(宽度,高度,参数);

            如果(大小!= NULL){
                parameters.set previewSize(size.width,size.height);
                camera.setParameters(参数);
                cameraConfigured = TRUE;
            }
        }
    }
}

私人无效开始preVIEW(){
    如果(cameraConfigured&安培;&安培;!摄像头= NULL){

        camera.start preVIEW();
        在preVIEW = TRUE;
    }
}

SurfaceHolder.Callback surfaceCallback =新SurfaceHolder.Callback(){
    公共无效surfaceCreated(SurfaceHolder持有者){
        //空操作 - 等到surfaceChanged()
    }

    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,
            INT高度){
        初始化preVIEW(宽,高);
        启动preVIEW();
    }

    公共无效surfaceDestroyed(SurfaceHolder持有者){
        //空操作
        如果(相机!= NULL){
            / *
             *叫停preVIEW()停止更新preVIEW表面。
             * /
            camera.stop preVIEW();

            / *
             *重要:呼叫释放()所发布使用相机
             *其他的应用程序。应用程序应该释放相机
             *立即的onPause()(并重新打开(),它在onResume())。
             * /
            camera.release();

            摄像头= NULL;
        }
    }
};
}
 

解决方案

您似乎忘了叫设置previewDisplay()(或者,在你的情况下, ,的init preVIEW())之前调用启动preVIEW()重启previev()方法。实际上,你试图启动preVIEW而不指定表面呈现preVIEW成。

Hi guys i am trying to switch between the device's Front and Back Camera while showing the camera preview. I am following the sample provide by common ware. Below is the code which i am using and whenever i click on the Flip button the surface view goes black and i don't know where i am going wrong. Please help me to solve this issue. I searched about this and i didn't get any suitable answers as some have tried to restart the current activity but i dont want like that. Hoping for better response. Thanks in Advance.

package com.commonsware.android.camera;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;
import android.widget.ToggleButton;
public class PreviewDemo extends Activity {
    private SurfaceView preview = null;
    private SurfaceHolder previewHolder = null;
    private Camera camera = null;
    private boolean inPreview = false;
    private boolean cameraConfigured = false;
    private ToggleButton flipCamera;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    flipCamera = (ToggleButton) findViewById(R.id.flip);
    preview = (SurfaceView) findViewById(R.id.preview);
    previewHolder = preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    flipCamera.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            // TODO Auto-generated method stub
            restartPreview(isChecked);
        }
    });

}

@Override
public void onResume() {
    super.onResume();

    // camera=Camera.open();
    int camId = Camera.CameraInfo.CAMERA_FACING_BACK;
    if (Camera.getNumberOfCameras() > 1
            && camId < Camera.getNumberOfCameras() - 1) {
        // startCamera(camId + 1);
        camera = Camera.open(camId + 1);
    } else {
        // startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
        camera = Camera.open(camId);
    }
    startPreview();
}

void restartPreview(boolean isFront) {
    if (inPreview) {
        camera.stopPreview();
    }
    //
    camera.release();

    // camera=null;
    // inPreview=false;
    // /*int camId = Camera.CameraInfo.CAMERA_FACING_BACK;
    // if (Camera.getNumberOfCameras() > 1 && camId <
    // Camera.getNumberOfCameras() - 1) {
    // //startCamera(camId + 1);
    // camera = Camera.open(camId + 1);
    // } else {
    // //startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
    // camera = Camera.open(camId);
    // }*/
    int camId = Camera.CameraInfo.CAMERA_FACING_BACK;
    if (isFront) {
        camera = Camera.open(camId);
        camera.startPreview();

    } else {
        camera = Camera.open(camId + 1);
        camera.startPreview();

    }
    // startPreview();
}

@Override
public void onPause() {
    if (inPreview) {
        camera.stopPreview();
    }

    camera.release();
    camera = null;
    inPreview = false;

    super.onPause();
}

private Camera.Size getBestPreviewSize(int width, int height,
        Camera.Parameters parameters) {
    Camera.Size result = null;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
        if (size.width <= width && size.height <= height) {
            if (result == null) {
                result = size;
            } else {
                int resultArea = result.width * result.height;
                int newArea = size.width * size.height;

                if (newArea > resultArea) {
                    result = size;
                }
            }
        }
    }

    return (result);
}

private void initPreview(int width, int height) {
    if (camera != null && previewHolder.getSurface() != null) {
        try {
            camera.setPreviewDisplay(previewHolder);
        } catch (Throwable t) {
            Log.e("PreviewDemo-surfaceCallback",
                    "Exception in setPreviewDisplay()", t);
            Toast.makeText(PreviewDemo.this, t.getMessage(),
                    Toast.LENGTH_LONG).show();
        }

        if (!cameraConfigured) {
            Camera.Parameters parameters = camera.getParameters();
            Camera.Size size = getBestPreviewSize(width, height, parameters);

            if (size != null) {
                parameters.setPreviewSize(size.width, size.height);
                camera.setParameters(parameters);
                cameraConfigured = true;
            }
        }
    }
}

private void startPreview() {
    if (cameraConfigured && camera != null) {

        camera.startPreview();
        inPreview = true;
    }
}

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
    public void surfaceCreated(SurfaceHolder holder) {
        // no-op -- wait until surfaceChanged()
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        initPreview(width, height);
        startPreview();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // no-op
        if (camera != null) {
            /*
             * Call stopPreview() to stop updating the preview surface.
             */
            camera.stopPreview();

            /*
             * Important: Call release() to release the camera for use by
             * other applications. Applications should release the camera
             * immediately in onPause() (and re-open() it in onResume()).
             */
            camera.release();

            camera = null;
        }
    }
};
}

解决方案

You seem to have forgotten to call setPreviewDisplay() (or, in your case, initPreview()) before calling startPreview() from your restartPreviev() method. Effectively, you're trying to start preview without specifying a surface to render the preview into.

这篇关于摄像机之间的Andr​​oid摄像头preVIEW开关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆