【问题标题】:Camera Error when after accessing video capture again, MediaStore.ACTION_VIDEO_CAPTURE再次访问视频捕获后出现相机错误,MediaStore.ACTION_VIDEO_CAPTURE
【发布时间】:2015-02-24 01:55:15
【问题描述】:

我正在试验我的项目的视频录制,我正在使用它来访问它。我的测试设备也是 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);
        }

因此,它会将我引导至视频意图。然后当我按下返回按钮将应用程序返回到其主视图并再次启动视频录制时,我得到“相机错误:无法连接到相机”。

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

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

  1. 在 MainView 按下按钮以获取视频意图

  2. (视频结束/取消时)

  3. 返回主视图

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

  5. “相机错误:无法连接到相机”。

这里是初始化我的相机的代码。

这是我的主要观点:

@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;
}

【问题讨论】:

    标签: android video camera video-recording


    【解决方案1】:

    我刚刚想通了。实际发生的情况是,由于活动过程的速度如此之快,相机永远无法正确关闭自己。因此,当视频意图关闭时,它会立即设置摄像头,因此,在摄像头已经设置的情况下进行设置。此外,由于没有正确处理相机,因此返回视频意图会导致相机错误。

    要解决这个问题,我只需要延迟进程,让相机有时间自行关闭。我的应用不再崩溃。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多