【问题标题】:Switch Camera in Android在 Android 中切换相机
【发布时间】:2012-04-18 13:32:49
【问题描述】:

我正在关注以下示例: http://developer.android.com/guide/topics/media/camera.html

用于开发相机应用程序。

这个应用程序显示一个相机预览和一个按钮,当用户点击按钮时,照片被拍摄并保存,相机预览再次显示。

但我现在想切换到前置摄像头。关于如何做到这一点的任何想法?可以从前置或后置摄像头开始,但我无法在运行时更改它,就好像我调用了一个新的摄像头实例,应用程序崩溃了。

知道如何做到这一点吗?

提前致谢, 秘鲁人

【问题讨论】:

标签: android


【解决方案1】:

您一次只能打开一个相机。也就是说,您必须先release() 后置摄像头open(1) 前置摄像头。

【讨论】:

    【解决方案2】:

    你可以打开任何你想要的相机,见下面的链接

    http://developer.android.com/reference/android/hardware/Camera.html#open(int)

    如上链接所示,你应该使用

    c = Camera.open(int) 而不是 c = Camera.open()

    【讨论】:

    • 嗨。是的,我试过了,这个可以用来切换摄像头。但我想做的是在拍照后应用程序应该切换到前置摄像头。我尝试使用前置摄像头参数 (Camera.open(1)) 调用新的摄像头实例,但它崩溃了。
    【解决方案3】:

    这是我的做法:

    private Camera mCamera=null;
    private CameraPreview mPreview;
    public FrameLayout preview;
    
            @Override
    public void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera_preview);
        View myView= (View) findViewById(R.id.camera_previeww);
        myView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
    
        cameraID= Camera.CameraInfo.CAMERA_FACING_FRONT;
        mCamera=openCamera(cameraID);
        mCamera.startPreview();
    
        // Create our Preview view and set it as the content of our activity.
        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) this.findViewById(R.id.camera_previeww);
        preview.addView(mPreview);
    }
    
    public void switchCamera(){
    
        mCamera.stopPreview();
        releaseCamera();
        if (cameraID==Camera.CameraInfo.CAMERA_FACING_BACK){
            cameraID=Camera.CameraInfo.CAMERA_FACING_FRONT;
        }else{
            cameraID=Camera.CameraInfo.CAMERA_FACING_BACK;
        }
    
        mCamera=openCamera(cameraID);
        mCamera.startPreview();
    
        CameraPreview mPreview = new CameraPreview(this, mCamera);
        preview = (FrameLayout) this.findViewById(R.id.camera_previeww);
        preview.removeAllViews();
        preview.addView(mPreview);
    
    }
    public  Camera openCamera(int cameraIDD){
        Camera c=null;
        try{
            c=Camera.open(cameraIDD);
        }catch (Exception e){
            Log.d("Camera Activity", e.getMessage());
        }
        return c;
    
    }
    

    你只需要调用switch()方法来改变从后到前或从前到后。该活动通过从另一个活动调用 startActivity(this, Class) 开始。

    【讨论】:

      【解决方案4】:

      一个可能的解决方案是获取 SurfaceView 的持有者(在我试图修复的场景是从前置摄像头切换到后置摄像头,反之亦然)。

          public void switchCamera(){
          Log.i(TAG, "Switching Camera");
          if (mCamera != null) {
              mCamera.stopPreview();
              mCamera.release();
              //mCamera = null;
          }
      
          //swap the id of the camera to be used
          if (camId == Camera.CameraInfo.CAMERA_FACING_BACK) {
              camId = Camera.CameraInfo.CAMERA_FACING_FRONT;
          }else {
              camId = Camera.CameraInfo.CAMERA_FACING_BACK;
          }
          try {
              mCamera = Camera.open(camId);
              //mCamera.setDisplayOrientation(90);
              //You must get the holder of SurfaceView!!!
              mCamera.setPreviewDisplay(mView.getHolder());
              //Then resume preview...
              mCamera.startPreview();
          }
          catch (Exception e) { e.printStackTrace(); }
      }
      

      希望它对遇到类似问题的人有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多