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) {

        }
    }
}
相关推荐
恋猫de小郭5 小时前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
三少爷的鞋5 小时前
不要让调用方承担你本该承担的复杂度 —— Android Data 层设计原则
android
李李李勃谦5 小时前
Flutter 框架跨平台鸿蒙开发 - 创意灵感收集
android·flutter·harmonyos
fengci.6 小时前
ctfshow其他(web396-web407)
android
JJay.6 小时前
Android 17 大屏适配变化解
android
TE-茶叶蛋7 小时前
结合登录页-PHP基础知识点解析
android·开发语言·php
alexhilton8 小时前
Jetpack Compose元球边缘效果
android·kotlin·android jetpack
y小花8 小时前
安卓音频子系统之USBAlsaManager
android·音视频
KevinCyao9 小时前
安卓android视频短信接口怎么集成?AndroidStudio视频短信开发指南
android