在Activity和附贴的Fragment中同时使用多Surface错乱解决

Posted VE视频引擎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Activity和附贴的Fragment中同时使用多Surface错乱解决相关的知识,希望对你有一定的参考价值。

SurfaceView因为独特的双缓冲机制,在android应用中十分普遍,视频播放器、摄像机预览等都会用到,如果在两个Fragment或者一个Fragment和Activity同时使用都会造成无法正常显示。即使设置前面的SurfaceView为不可见也会在少部分机型上依然存在该问题。后来发现原因是SurfaceView是在Windows层显示的,仅仅用View层的方法并不能控制Surface的生命周期。
解决办法:在需要播放视频的位置外层嵌套一个Layout,这里我用的Framelayout,在释放的时候使用removeAllViews直接释放SurfaceView和他的Surface对象,下面代码:

/**
 * 释放资源
 */
 private void release() {
    if (mSurfaceView != null && mSurfaceView.getHolder() != null && mSurfaceView.getHolder().getSurface() != null) {
        mSurfaceView.getHolder().getSurface().release();
        if (mSurfaceHolder != null && mEquipmentVideoCallBack != null) {
            mSurfaceHolder.removeCallback(mEquipmentVideoCallBack);
            mSurfaceHolder = null;
        }
    }
    parentLayout.removeAllViews();
 }

需要注意的是,只要界面不在前台或者失去焦点的时候都需要释放一次,还有每次重新播放前也需要释放一次,重新进入准备状态。

//第1:显示个隐藏的时候
 @Override
 public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    release();
 }
   
//第2:从新获取焦点到前台
 @Override
 public void onResume() {
    super.onResume();
    release();
}
   
//第3:在类似视频播放器功能的时候一个视频播放完也需要释放

以上是关于在Activity和附贴的Fragment中同时使用多Surface错乱解决的主要内容,如果未能解决你的问题,请参考以下文章

安卓activity怎样跳转到fragment

android之Fragment(官网资料翻译)

将数据从 Fragment Activity 传输到 Fragment

activity怎么跳转到fragment

Hilt Fragment 必须附加到@AndroidEntryPoint Activity,同时测试(它附加到@AndEntPoint 标记的活动)

Android安卓开发之activity如何传值到fragment,activity与fragment传值