CWAC Camera - 一个布局中的多个摄像机视图(以及它们之间的切换)

时间:2014-04-27 21:45:18

标签: android commonsware-cwac

我正在尝试构建类似于新的Front Back应用程序的相机功能 - 您可以在同一活动中拍摄两张照片,并在屏幕的一半显示每张照片。因此,屏幕的上半部分将显示相机预览,而下半部分为黑色,然后您拍摄一张照片,该照片显示在原位(上半部分),然后屏幕的下半部分将显示成为预览,然后您可以拍摄另一张照片,然后将其显示在屏幕的下半部分。我希望能够在每一步都在标准摄像机视图和前置摄像头之间来回切换。

我设法让大部分功能正常工作 - 你可以拍摄这两张照片,但我无法在第二张图片捕捉的标准和正面之间切换,因为我被迫重新创建一个新片段(或重复使用前面创建的前面一个),我丢失了第一步中拍摄的图像。

如果不清楚,请按照以下方法进行操作:我创建了一个片段,并在屏幕的上半部分使用“摄像机视图”来扩充布局,并在下半部分(我最初尝试给两个摄像机视图充气,但是无法在顶部摄像机视图中停止预览,然后在底部视图中重新启动它 - 如果有这样的方式,那么我就是俯瞰,请让我知道)。一旦我捕获到顶部图像,我抓住整个字节数组,然后从总高度的1/4偏移量创建一个位图到总高度的3/4。这使我可以准确显示预览中的内容(不必要的细节,但我认为他们可能会在将来帮助某人)。由于我无法使用第二个CameraView,所以我采用了一种简单的方式来减少"撞击"相同的摄像机视图并重复使用 - 我从布局中删除了填充视图,并将其重新添加到位置0的布局中,在下方(较低的z值)下方显示现在显示的图像。所以,现在相机预览显示在底部,我可以重复捕获图像并在底部显示它的过程。但是,如果我想在此时切换到前置摄像头,我必须完全切换片段,然后丢失第一张图像 - 过程重新开始。我刚刚意识到我可以将图像数据从片段传递到片段(或传递URI,因为图像超过了1 MB的意图限制),但似乎应该有一种更简单的方法来实现这一点。

我还尝试了嵌套片段 - 使上半部分和下半部分都有自己的相机片段,每个片段在适当的时间充气自己的相机视图,但我得到了未知的相机错误(错误2)

这是图书馆的限制还是我忽略了解决方案?

提前感谢您的所有帮助。

2 个答案:

答案 0 :(得分:0)

  

我刚刚意识到我可以将图像数据从片段传递到片段(或者传递URI,因为图像超过了1 MB的意图限制),但似乎应该有一种更简单的方法来实现这一点。

让托管活动保留在图像上。

或者,如果您支持配置更改,请将保留的片段保留在图像上。

答案 1 :(得分:0)

不确定您是否还在寻找单片段解决方案。但我设法使用以下代码切换前/后摄像头,而不创建另一个片段。所以,你可以修改一下它应该适合你的。

我的解决方案就像删除当前的CameraView实例并添加一个新实例一样简单。如果您希望将其添加到另一个框架,请成为我的客人。

将CameraView动态添加到Framelayout中:

public class MyCameraFragment extends CameraFragment {

CameraView cameraView;

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    addCameraView(view);
}

private void addCameraView(View view) {
    FrameLayout frame = (FrameLayout)v.findViewById(R.id.cameraFrame);
    frame.removeAllViews();
    cameraView = new CameraView(getActivity());
    cameraView.setHost(cameraHost = new MyCameraHost(getActivity()));
    setCameraView(cameraView);
    frame.addView(cameraView);
}

private void doSwitchCamera() {
    // do some change to the settings.
    useFrontFacingCamera = !useFrontFacingCamera;
    if (null != cameraView) {
        cameraView.onPause();
    }
    addCameraView(getView());
    cameraView.onResume();
}

}

我不确定super.onPause()和super.onResume()是否必要,但他们确实调用了CameraView的onPause()和onResume(),我认为这是必要的。

编辑:经过一些代码调查和测试,我发现调用super.onPause / onResume是没有必要的。只需在cameraView上调用onPause和onResume即可。