MediaStore.ACTION_VIDEO_CAPTURE再次访问视频捕获后出现相机错误

时间:2015-02-24 01:55:15

标签: android video camera video-recording

我正在尝试在我的项目上进行视频录制,我正在使用它进行访问。我的测试设备也是Nexus 5版本4.4 KitKat。

Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        takeVideoIntent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        takeVideoIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
        }

所以,它引导我进入视频意图。然后当我按下后退按钮将应用程序返回到主视图,然后再次启动视频录制时,我得到了#34;相机错误:无法连接到相机"。

我必须在设备上打开内置相机应用程序并关闭它,以便我可以在我的项目中打开它。

注意: 我的主视图是我的图像捕获的自定义视图,具有预览,从那里我有一个按钮,执行上面的视频捕获代码。所以,发生的事情有点像这样(按顺序):

  
      
  1. 在MainView按下视频意图按钮

  2.   
  3. (视频完成/取消时)

  4.   
  5. 返回MainView

  6.   
  7. (再次按下视频意图按钮)

  8.   
  9. "相机错误:无法连接相机"。

  10.   

以下是初始化我的相机的代码。

这是我的主要观点:

@Override
protected void onResume() {
    super.onResume();
    mCameraLoader.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    mCameraLoader.onPause();
}

这些是CameraLoader类中的函数:

public void onResume() {
    setUpCamera(mCurrentCameraId);
}

private Camera getCameraInstance(final int id) {
    Camera c = null;
    try {
        c = mCameraHelper.openCamera(id);
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("ASDA", "" + e.getMessage());
    }
    return c;
}

private void setUpCamera(final int id) {
    mCameraInstance = getCameraInstance(id);
    Camera.Parameters parameters = mCameraInstance.getParameters();
    if (parameters.getSupportedFocusModes().contains(
            Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
    }


    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
    for (int i = previewSizes.size() - 1; i >= 0; i--) {
        if ((previewSizes.get(i).height == DEF_HEIGHT)
                && (previewSizes.get(i).width == DEF_WIDTH)) {
            mCameraSize = previewSizes.get(i);
            parameters.setPreviewSize(mCameraSize.width, mCameraSize.height);
            Log.e("preview_sizeness", "index: " + i + "    width: " + previewSizes.get(i).width
                    + "    height: " + previewSizes.get(i).height);
            break;
        }
    }
    mCameraInstance.setParameters(parameters);

    int orientation = mCameraHelper.getCameraDisplayOrientation(this.activity,
            mCurrentCameraId);
    CameraHelper.CameraInfo2 cameraInfo = new CameraHelper.CameraInfo2();
    mCameraHelper.getCameraInfo(mCurrentCameraId, cameraInfo);
    boolean flipHorizontal = cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT;
    mGPUImage.setUpCamera(mCameraInstance, orientation, flipHorizontal, false);
    Camera.Parameters paramss = this.mCameraInstance.getParameters();

    paramss.setRotation(90);

    this.mCameraInstance.setParameters(paramss);
}

public void onPause() {
    releaseCamera();
}

private void releaseCamera() {
    mCameraInstance.setPreviewCallback(null);
    mCameraInstance.release();
    mCameraInstance = null;
}

1 个答案:

答案 0 :(得分:0)

我只想出了这个。实际上发生的事情是,由于活动进行得有多快,相机在某种程度上从未找到适当关闭自己的机会。因此,当视频意图关闭时,它会立即设置摄像头,因此,在已经设置摄像头的同时设置摄像头。此外,由于未正确处理相机,返回视频意图会导致相机错误。

要解决这个问题,我只需要延迟进程以使Camera有时间关闭。我的应用程序不再崩溃。

干杯!