Android:单击按钮时切换相机 [英] Android: Switch camera when button clicked

查看:22
本文介绍了Android:单击按钮时切换相机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为 switchCamera 的方法,我试图通过单击按钮将相机从前切换到后,平滑过渡.当我调用此方法时,我的应用程序冻结 - 我知道我没有做正确的事情.有人可以帮我吗?

非常感谢任何帮助.

public void switchCamera(){int camNum = 0;camNum = Camera.getNumberOfCameras();int camBackId = Camera.CameraInfo.CAMERA_FACING_BACK;int camFrontId = Camera.CameraInfo.CAMERA_FACING_FRONT;Camera.CameraInfo currentCamInfo = new Camera.CameraInfo();//如果相机正在运行如果(相机!= null){//并且有不止一个摄像头如果 (camNum > 1){//停止当前相机相机.停止预览();camera.setPreviewCallback(null);//camera.takePicture(null, null, PictureCallback);相机.释放();相机 = 空;//停止surfaceHolder?如果(currentCamInfo.looking == Camera.CameraInfo.CAMERA_FACING_FRONT){//切换摄像头到后置摄像头相机=Camera.open(camBackId);}别的{//将摄像头切换到前置摄像头相机=Camera.open(camFrontId);}//重新打开相机//指定表面?尝试 {camera.setPreviewDisplay(surfaceHolder);camera.setPreviewCallback((PreviewCallback) 这个);相机.开始预览();} catch (IOException e) {//TODO 自动生成的 catch 块e.printStackTrace();}}}}

解决方案

Button otherCamera = (Button) findViewById(R.id.OtherCamera);otherCamera.setOnClickListener(new View.OnClickListener() {@覆盖public void onClick(View v) {如果(预览中){相机.停止预览();}//注意:如果你在切换前不释放当前相机,你的应用程序会崩溃相机.释放();//交换要使用的相机的idif(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;}别的 {currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;}相机 = Camera.open(currentCameraId);setCameraDisplayOrientation(CameraActivity.this, currentCameraId, camera);尝试 {camera.setPreviewDisplay(previewHolder);} catch (IOException e) {e.printStackTrace();}相机.开始预览();}

<块引用>

如果您想让相机图像以相同的方向显示显示,您可以使用以下代码.

public static void setCameraDisplayOrientation(Activity activity,int cameraId, android.hardware.Camera 相机) {android.hardware.Camera.CameraInfo 信息 =新的 android.hardware.Camera.CameraInfo();android.hardware.Camera.getCameraInfo(cameraId, info);int 旋转 = activity.getWindowManager().getDefaultDisplay().getRotation();整数度 = 0;开关(旋转){case Surface.ROTATION_0:度数= 0;休息;case Surface.ROTATION_90:度数= 90;休息;case Surface.ROTATION_180:度数= 180;休息;case Surface.ROTATION_270:度数= 270;休息;}整数结果;如果(信息.面对== Camera.CameraInfo.CAMERA_FACING_FRONT){结果 = (info.orientation + 度数) % 360;结果 = (360 - 结果) % 360;//补偿镜像} else {//背面结果 = (info.orientation - 度数 + 360) % 360;}camera.setDisplayOrientation(结果);}

I have a method called switchCamera, I'm trying to switch camera from front to back on the click of a button, in one smooth transition. My application freezes when I call this method - I know I'm not doing something right. Can anyone help me out here?

Any help is much appreciated.

public void switchCamera(){
    int camNum = 0;
    camNum = Camera.getNumberOfCameras();
    int camBackId = Camera.CameraInfo.CAMERA_FACING_BACK;
    int camFrontId = Camera.CameraInfo.CAMERA_FACING_FRONT;

    Camera.CameraInfo currentCamInfo = new Camera.CameraInfo();

    //if camera is running
    if (camera != null){
        //and there is more than one camera
        if (camNum > 1){
            //stop current camera
            camera.stopPreview();
            camera.setPreviewCallback(null);
            //camera.takePicture(null, null, PictureCallback);
            camera.release();
            camera = null;
            //stop surfaceHolder?

            if (currentCamInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
                //switch camera to back camera
                camera=Camera.open(camBackId);
            }
            else{
                //switch camera to front camera
                camera=Camera.open(camFrontId);
            }
            //switch camera back on
            //specify surface?
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.setPreviewCallback((PreviewCallback) this);
                camera.startPreview();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

解决方案

Button otherCamera = (Button) findViewById(R.id.OtherCamera);

otherCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (inPreview) {
    camera.stopPreview();
}
//NB: if you don't release the current camera before switching, you app will crash
camera.release();

//swap the id of the camera to be used
if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;
}
else {
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
}
camera = Camera.open(currentCameraId);

setCameraDisplayOrientation(CameraActivity.this, currentCameraId, camera);
try {

    camera.setPreviewDisplay(previewHolder);
} catch (IOException e) {
    e.printStackTrace();
}
camera.startPreview();
}

If you want to make the camera image show in the same orientation as the display, you can use the following code.

public static void setCameraDisplayOrientation(Activity activity,
         int cameraId, android.hardware.Camera camera) {
     android.hardware.Camera.CameraInfo info =
             new android.hardware.Camera.CameraInfo();
     android.hardware.Camera.getCameraInfo(cameraId, info);
     int rotation = activity.getWindowManager().getDefaultDisplay()
             .getRotation();
     int degrees = 0;
     switch (rotation) {
         case Surface.ROTATION_0: degrees = 0; break;
         case Surface.ROTATION_90: degrees = 90; break;
         case Surface.ROTATION_180: degrees = 180; break;
         case Surface.ROTATION_270: degrees = 270; break;
     }

     int result;
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
         result = (info.orientation + degrees) % 360;
         result = (360 - result) % 360;  // compensate the mirror
     } else {  // back-facing
         result = (info.orientation - degrees + 360) % 360;
     }
     camera.setDisplayOrientation(result);
 }

这篇关于Android:单击按钮时切换相机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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