在 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 中处于首位。