Android Media3 PlayerView 监听 SurfaceTextureListener

Android Media3 PlayerView 监听 SurfaceTextureListener

  • 由于 PlayerView 内部已经设置过 SurfaceTextureListener 的监听了,不能直接设置
java 复制代码
//androidx.media3.ui.PlayerView 设置 app:surface_type="texture_view"
View videoSurfaceView = playerView.getVideoSurfaceView();
if (videoSurfaceView == null) {
    return;
}
if (videoSurfaceView instanceof TextureView) {
  TextureView textureView = (TextureView) videoSurfaceView;
  //先 textureView.getSurfaceTextureListener() 得到系统已设置的监听
  textureView.setSurfaceTextureListener(new SurfaceTextureProxy(textureView.getSurfaceTextureListener(), new SurfaceTextureProxy.Listener() {
      @Override
      public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
          Log.e(TAG, "onSurfaceTextureAvailable: test");
      }
  }));
}
java 复制代码
public class SurfaceTextureProxy implements TextureView.SurfaceTextureListener {

    //源对象
    private TextureView.SurfaceTextureListener originListener;
    private Listener listener;

    public SurfaceTextureProxy(TextureView.SurfaceTextureListener originListener, Listener listener) {
        this.originListener = originListener;
        this.listener = listener;
    }

    @Override
    public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) {
        originListener.onSurfaceTextureAvailable(surface, width, height);
        Log.e("TAG", "onSurfaceTextureAvailable: zfq0221" + originListener);
        //
        listener.onSurfaceTextureAvailable(surface, width, height);
    }

    @Override
    public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) {
        originListener.onSurfaceTextureSizeChanged(surface, width, height);
        //
        listener.onSurfaceTextureSizeChanged(surface, width, height);
    }

    @Override
    public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) {
        boolean result = originListener.onSurfaceTextureDestroyed(surface);
        //
        listener.onSurfaceTextureDestroyed(surface);
        return result;
    }

    @Override
    public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {
        originListener.onSurfaceTextureUpdated(surface);
        //
        listener.onSurfaceTextureUpdated(surface);
    }


    public interface Listener {

        default void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        }

        default void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        }

        default void onSurfaceTextureDestroyed(SurfaceTexture surface) {
        }

        default void onSurfaceTextureUpdated(SurfaceTexture surface) {

        }
    }
}
相关推荐
峥嵘life6 小时前
Android16 311Y3 EAP-TLS 网络连接失败分析与修复总结
android·开发语言·人工智能·php
Kapaseker7 小时前
破坏性更新 - 解读 Jetpack Compose 1.12
android·kotlin
雨白8 小时前
我的 UML 学习笔记:结合 Android 实例看懂 4 种常用图表
android·架构
怣疯knight8 小时前
快速判断apk有没有支持16kb页面标准
android
风流 少年9 小时前
Spring AI 2.0:Advisor
android·人工智能·spring
YM52e10 小时前
分页查询的基石:ArkTS 为鸿蒙商品列表设计 LIMIT/OFFSET 的表
android·学习·华为·harmonyos
安卓与AI研习社12 小时前
Android ANR 到底怎么定位?从触发原理到日志判断的完整方法
android
阿pin14 小时前
Android随笔-MVI
android·mvi
leobertlan14 小时前
【好玩系列】训练一个神经网络指导小孩玩游戏
android·机器学习·程序员
Android-Flutter15 小时前
android LeakCanary 工作原理 详解
android·kotlin