You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:36:39