本地视频始终高于其他视图

Local video is always above other views

我们目前正在测试 android (v3.12.3) 的 sinch sdk 并遇到以下问题:本地视图始终位于其他视图之上,即使它在视图层次结构中排在第一位,也应位于视图下方稍后再来——我们想以画中画的形式显示本地视频全屏和远程视频——在这种情况下,本地全屏视频覆盖 pip-view。考虑简单布局

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">


<FrameLayout android:id="@+id/fullscreen_video_view"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>

<FrameLayout
        android:id="@+id/pip_video_view"
        android:layout_width="150dp"
        android:layout_height="112dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="16dp"
        android:layout_marginRight="16dp"/>

Pip-View 排在最后,通常应该在 Fullscreen-View 之上。但是如果我们将本地视频添加到 Fullscreen-View - 它会覆盖 Pip-View。将本地视频添加到 Pip 按预期工作 - Pip 在全屏之上。该问题在 Android 仿真器 Android 6.0 和真实设备(三星平板电脑 Android 4.4)

上都可重现

我已经截图说明问题了

我可以确认是这种情况,将在以后的版本中解决。

我找到了解决该问题的方法。我不能称之为真正的解决方案,因为它依赖于从 VideoController

中 return 编辑的某些类型的视图
    View remoteView = vc.getRemoteView();
    if (remoteView instanceof SurfaceView) {
            ((SurfaceView) remoteView).setZOrderOnTop(true);

    }

只要远程视图是 SurfaceView 类型(实际上是 GLSurfaceView),我们就可以使用 setZOrderOnTop 使其显示在所有 windows 之上。我不能称之为真正的解决方案,因为不能保证从 getRemoteView 编辑的视图 return 将始终是 SurfaceView(或将提供对 surfaceview 的访问)。例如 getLocalView returns 是一个围绕 surfaceview 的包装视图,因此无法合法访问它。我认为可能的解决方案是 return 允许 setZOrderOnTop and/or setZOrderMediaOverlay 调用的 "special" 视图(您可以命名不同的方法以更清楚地解释它们的含义)