如何检测cordova-plugin-media插件音频是否正在或已开始播放
cordova-plugin-media 音频播放状态检测方案
不需要额外引入第三方依赖或者魔改插件,插件原生就提供了完整的播放状态感知能力,可以同时覆盖「是否成功启动播放」「是否正在播放」两个判断需求。
核心判断依据:Media实例状态常量
每个通过new Media()创建的实例,都内置了状态枚举和实时状态值,对应关系如下:
Media.MEDIA_NONE = 0:未执行任何加载、播放操作Media.MEDIA_STARTING = 1:正在加载资源、启动播放流程,尚未正式出音Media.MEDIA_RUNNING = 2:音频加载完成,成功启动且正在正常播放Media.MEDIA_PAUSED = 3:音频已暂停Media.MEDIA_STOPPED = 4:音频已停止播放
只要实例状态变为Media.MEDIA_RUNNING,就代表音频已经成功启动、当前处于正在播放状态。如果状态长时间停留在MEDIA_STARTING没有跳转,一般是资源地址错误、格式不支持、权限/白名单未配置导致的播放失败。
推荐实现方式:绑定状态变更回调
不推荐轮询读取实例的state属性做判断,部分低版本安卓、iOS机型上state属性存在同步延迟,直接在初始化Media实例时传入状态变更回调是最可靠的方案,参考代码如下:
// 维护业务层播放标记,方便全局调用判断 let isAudioPlaying = false const audioInstance = new Media( '/local-or-remote-audio-path.mp3', // 播放自然结束回调 () => { isAudioPlaying = false }, // 播放错误回调 (error) => { isAudioPlaying = false console.log('播放失败,错误码:', error.code) }, // 核心:状态变更回调,所有播放状态变化都会触发这个方法 (statusCode) => { switch(statusCode) { case Media.MEDIA_STARTING: console.log('正在启动音频加载...') break case Media.MEDIA_RUNNING: isAudioPlaying = true console.log('音频启动成功,正在播放') break case Media.MEDIA_PAUSED: isAudioPlaying = false console.log('音频已暂停') break case Media.MEDIA_STOPPED: isAudioPlaying = false console.log('音频已停止') break } } ) // 调用播放方法 audioInstance.play() // 业务层任意位置需要判断播放状态时,直接读isAudioPlaying即可
常见踩坑说明
- 调用
play()方法是异步操作,不要在执行play()后立刻读取状态判断是否播放成功,必须等状态回调返回MEDIA_RUNNING才代表启动成功 - 安卓端播放远程音频时,需要提前在
config.xml中配置对应资源域名的白名单,否则会直接加载失败,永远无法进入MEDIA_RUNNING状态 - iOS端音频被系统中断(来电、Siri唤醒、其他音频App抢占通道)时,会自动将状态切为暂停,中断结束后不会自动恢复播放,需要手动监听状态做后续处理
- 如果项目中存在多个音频切换播放的场景,建议封装全局音频管理单例统一维护
isAudioPlaying标记,避免多实例状态冲突
内容的提问来源于stack exchange,提问作者Massimiliano Comunale
相关产品推荐
相关产品推荐

