uni-app中安卓app的uni.createInnerAudioContext()的onEnded事件不触发

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app中安卓app的uni.createInnerAudioContext()的onEnded事件不触发

this.audio1 = uni.createInnerAudioContext()  
this.audio1.sessionCategory = "ambient"  
this.audio1.src = this.fileUrl  
this.audio1.onPlay(() => {  
  console.log('开始播放');  
});  
this.audio1.onEnded = () => {  
  console.log('结束播放');  
}  
this.audio1.play()  
this.isPlay = true

audio是在data里定义的,onPlay生效,onEnded不会触发


1 回复

在uni-app开发中,如果遇到uni.createInnerAudioContext()onEnded事件在安卓设备上无法触发的问题,这通常与音频播放管理、事件监听机制或者设备兼容性有关。以下是一些可能的解决方案,主要通过代码示例来展示如何排查和修复这个问题。

1. 确认音频文件路径和格式

首先,确保你提供的音频文件路径正确且格式被安卓设备支持。例如,MP3格式通常是广泛支持的。

const innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.src = 'https://example.com/audio/sample.mp3'; // 确保路径正确且文件可访问

2. 监听onEnded事件

接下来,确保你正确设置了onEnded事件监听器。

innerAudioContext.onEnded(() => {
  console.log('音频播放结束');
  // 在这里处理播放结束后的逻辑
});

3. 触发播放

确保音频被正确播放。

innerAudioContext.play();

4. 检查音量和暂停状态

有时音量设置为0或者音频被暂停也可能影响事件触发。确保音量不是0,且在监听onEnded之前音频未被暂停。

innerAudioContext.volume = 1; // 设置音量
// 确保没有调用 innerAudioContext.pause() 在监听 onEnded 之前

5. 兼容性处理

由于不同安卓版本的差异,有时需要额外的兼容性处理。可以尝试监听其他相关事件,如onError,来捕获可能的错误。

innerAudioContext.onError((err) => {
  console.error('音频播放出错:', err);
  // 可以在这里进行错误处理,比如重试播放等
});

6. 延迟触发检查

在某些极端情况下,可以尝试设置一个短暂的延迟来手动检查音频是否已结束(虽然这不是最佳实践,但可以作为临时解决方案)。

const checkAudioStatus = () => {
  if (!innerAudioContext.paused && innerAudioContext.currentTime >= innerAudioContext.duration) {
    console.log('手动检测到音频播放结束');
    // 执行结束后的逻辑
  } else {
    setTimeout(checkAudioStatus, 100); // 每100ms检查一次
  }
};

// 在播放后启动检查
innerAudioContext.play();
setTimeout(checkAudioStatus, 1000); // 延迟1秒后开始检查

总结

以上方法提供了一种系统化的方式来排查和解决uni.createInnerAudioContext()onEnded事件在安卓上不触发的问题。如果问题依然存在,建议查阅uni-app的官方文档或社区论坛,看看是否有其他开发者遇到并解决了类似的问题。

回到顶部