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