1

在 Android 2.3 应用程序中,我曾经支持两个摄像头:一个是内置的,一个是使用 Wi-Fi 的外部 MJPG 流式传输。内置摄像头必须一直在录制视频,并且用户必须能够在这些视频之间切换视图。因此,每个相机都有一个专用的 SurfaceView 可供绘制。由于添加到 FrameLayout 的最后一个子级具有更高的 Z 顺序,因此我以编程方式将所需的相机视图添加到最后一个 FrameLayout 以使其可见。我不能跳过添加内置摄像头,因为它无法在没有预览显示的情况下录制视频。

此方案不再适用于 Android 4:内置摄像头预览始终显示,无论是先添加还是最后添加。我在视图上使用了“setVisibility”方法,并注意到如果将其中一个视图设置为不可见(或消失),那么它们都不会显示。ViewGroup 的“bringChildToFront”方法也没有效果。

那么,是否有一些解决方法可以使这项工作在 Android 4 上运行?而且我知道拥有多个 SurfaceView 被认为是不好的。一些代码如下。

框架布局:

<FrameLayout android:id="@id/data"
             android:layout_width="fill_parent" android:layout_height="fill_parent"/>

填充布局的代码(不再适用于 Android 4):

private void setCorrectView() {
    data.removeAllViews();

    List<Recorder> others = recorders.getOthers();
    for (Recorder other : others) {
        addToTheView(other);
    }

    addToTheView(recorders.getCurrent());
}

private void addToTheView(Recorder recorder) {
    View view = recorder.getView(this); // get recorder's surface view
    data.addView(view);
}

如果我使用 XML 中的 FrameLayouts,效果相同:

<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
         xmlns:android="http://schemas.android.com/apk/res/android">

    <FrameLayout
        android:id="@id/data"
        android:layout_width="fill_parent" android:layout_height="fill_parent"/>

    <FrameLayout
        android:id="@+id/data_invisible"
        android:layout_width="fill_parent" android:layout_height="fill_parent"/>

</FrameLayout>

无论我把内置相机的表面视图放在哪里 - 它总是显示出来。看起来内置摄像头的预览现在始终在 Android 4 中处于首位。

4

1 回答 1

0

回答我自己。为了完成这项工作,我在启动相机之前将视图的可见性设置为 View.VISIBLE 并在之后将其设置为 View.INVISIBLE 。链接可能会有所帮助。

于 2012-11-10T18:26:52.977 回答