Skip to content

setMediaPlayerCreatedListener

设置多媒体播放器创建监听器

setMediaPlayerCreatedListener 用于监听小游戏内部 音频或视频播放实例 的创建。

当游戏脚本通过 JS API 创建一个新的音频对象(如 new InnerAudioContext())或视频对象时,SDK 会通过此监听器回调给原生层。这让 App 能够针对每一个具体的播放实例进行精细化管控(如单独控制某个背景音乐的音量,或拦截某个视频的播放请求)。


方法声明

java
/**
 * 设置多媒体播放器创建监听器
 * @param listener 监听器实例。传入 null 则取消监听。
 */
void setMediaPlayerCreatedListener(@Nullable SUDRTGameHandle.MediaPlayerCreatedListener listener);

内部接口与 Handle

java
public interface MediaPlayerCreatedListener {
    /**
     * 当小游戏创建一个新的播放器实例时触发
     * @param handle 对应单个播放器实例的控制句柄
     */
    void onCreated(@NonNull SUDRTGameHandle.MediaPlayerInstanceHandle handle);
}

public interface MediaPlayerInstanceHandle {
    /** 获取该实例的类型:0-音频, 1-视频 */
    int getType();
    
    /** 设置当前实例静音 */
    void setMute(boolean isMute);
    
    /** 设置当前实例音量 (0.0 - 1.0) */
    void setVolume(float volume);
    
    /** 停止并销毁当前播放实例 */
    void stop();
}

核心运行行为

1. 实例级管控

getMediaPlayerHandle 提供的全局控制不同,此监听器提供的是**实例级(Instance-level)**控制。你可以根据 getType() 区分它是音效还是视频。

2. 动态拦截

App 可以保存这些 handle 引用。例如,在 App 进入特定的“静音模式”时,遍历已保存的所有音频 handle 并执行 setMute(true)

3. 生命周期同步

当游戏内部销毁该 JS 对象时,原生层的 handle 也会相应失效。


代码示例:分类管理音视频

java
// 用于保存活跃的播放器句柄
private final List<SUDRTGameHandle.MediaPlayerInstanceHandle> audioHandles = new ArrayList<>();

gameHandle.setMediaPlayerCreatedListener(new SUDRTGameHandle.MediaPlayerCreatedListener() {
    @Override
    public void onCreated(@NonNull SUDRTGameHandle.MediaPlayerInstanceHandle handle) {
        if (handle.getType() == 0) { // 音频类型
            audioHandles.add(handle);
            Log.d("SUD_MEDIA", "A new audio context created by game.");
        } else if (handle.getType() == 1) { // 视频类型
            // 业务逻辑:如果是移动网络下,禁止视频自动播放
            if (isMobileNetwork()) {
                handle.stop(); 
                showToast("当前为移动网络,已自动停止视频播放");
            }
        }
    }
});

注意事项

  • 内存管理:如果你在 App 层持有了 MediaPlayerInstanceHandle 的引用,请务必在合适的时机(如 onStateChangedWAITING 或调用 destroy 时)清理你的 List/Map,防止内存泄漏。
  • 与全局设置的关系:通常全局静音(getMediaPlayerHandle().setMute())的优先级高于实例级设置。如果全局已静音,单个实例设置 setMute(false) 可能不会生效。
  • 异步性:此回调是在播放器实例创建瞬间触发的,此时资源可能尚未加载完成。