uni-app APP端 getBackgroundAudioManager 中 onWaiting 无法被监听,导致无法设置loading,严重降低用户使用体验

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

uni-app APP端 getBackgroundAudioManager 中 onWaiting 无法被监听,导致无法设置loading,严重降低用户使用体验

测试过的手机

realme ui 4.0, ios16.6

示例代码:

const bgAudioManager = uni.getBackgroundAudioManager();  
bgAudioManager.title = '致爱丽丝';  
bgAudioManager.singer = '暂无';  
bgAudioManager.coverImgUrl = 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/music-a.png';  
bgAudioManager.src = 'https://96.f.1ting.com/local_to_cube_202004121813/96kmp3/jn/12.jlhg/8.zhg/2.mp3';  
bgAudioManager.onWaiting(() => {  
  console.log('加载');  
});

操作步骤:

  • 根据以上原始代码,APP中的 getBackgroundAudioManager 的 onWaiting 无法打印 ‘加载’,无任何反应

预期结果:

  • APP中的 getBackgroundAudioManager 的 onWaiting 事件可以被监听,在资源稍卡时,加快加载速度,体验与小程序、H5一致即可

实际结果:

  • APP中的 getBackgroundAudioManager 的 onWaiting 事件不能被监听,无任何反馈

bug描述:

  • H5和小程序都没问题,唯独APP端
    • getBackgroundAudioManager 中 onWaiting 无法被监听
    • 音频加载速度明显慢于H5和小程序。在资源不卡能够快速获取时,影响不大。在同一时间,如果服务器稍微卡,APP加载播放音频超过20秒才能播放,小程序或H5只需要2秒左右。

| 开发环境 | 版本号 | 项目创建方式 |
|----------|--------|--------------|
| Windows  | 7      | HBuilderX    |
| PC       |        |              |
| 手机系统  |        | 全部         |
| 页面类型  |        | vue          |
| vue版本   |        | vue2         |
| 打包方式  |        | 云端         |

7 回复

在用户端网络卡的时候,无法检测waiting,无法给出loading,导致用户认为app死机了


请确认bug…

刚测试了你的代码。在hbx 3.96上 我这是可以进到onWaiting的

realme 系列手机通病,已测试小米手机没问题

realme 系列手机通病,已测试小米手机没问题

2024-09-05还未修复这个bug

uni-app 中使用 getBackgroundAudioManager 时,onWaiting 事件无法被监听,确实会影响用户体验,尤其是在网络较慢或音频加载时间较长的情况下,无法显示加载状态(如 loading 动画)会让用户感到困惑。

问题分析

onWaiting 事件是用于监听音频缓冲事件的,当音频数据不足以播放时触发。如果 onWaiting 无法被监听,可能是以下原因之一:

  1. 平台兼容性问题:不同平台(如 iOS 和 Android)对 getBackgroundAudioManager 的支持可能存在差异。
  2. 事件绑定问题:事件绑定可能未正确执行。
  3. API 实现问题uni-appgetBackgroundAudioManager 在某些平台上可能存在实现问题。

解决方案

1. 检查事件绑定

确保 onWaiting 事件已正确绑定。以下是一个示例代码:

const backgroundAudioManager = uni.getBackgroundAudioManager();

backgroundAudioManager.onWaiting(() => {
  console.log('音频正在缓冲,显示 loading');
  // 在这里显示 loading 动画
});

backgroundAudioManager.onCanplay(() => {
  console.log('音频可以播放,隐藏 loading');
  // 在这里隐藏 loading 动画
});

2. 使用其他事件作为替代

如果 onWaiting 无法正常工作,可以尝试使用其他事件来间接实现类似的功能。例如:

  • onCanplay:当音频可以播放时触发,可以在这里隐藏 loading。
  • onError:当音频加载失败时触发,可以在这里处理错误并隐藏 loading。
backgroundAudioManager.onCanplay(() => {
  console.log('音频可以播放,隐藏 loading');
  // 隐藏 loading 动画
});

backgroundAudioManager.onError((err) => {
  console.error('音频加载失败', err);
  // 隐藏 loading 动画并提示用户
});

3. 手动实现缓冲检测

如果 onWaiting 事件无法正常工作,可以手动检测音频的缓冲状态。例如,通过定时器检查 buffered 属性:

let isBuffering = false;

setInterval(() => {
  if (backgroundAudioManager.buffered < backgroundAudioManager.duration) {
    if (!isBuffering) {
      console.log('音频正在缓冲,显示 loading');
      isBuffering = true;
      // 显示 loading 动画
    }
  } else {
    if (isBuffering) {
      console.log('音频缓冲完成,隐藏 loading');
      isBuffering = false;
      // 隐藏 loading 动画
    }
  }
}, 1000);

4. 检查平台差异

如果问题仅出现在特定平台(如 iOS 或 Android),可以针对不同平台编写不同的代码逻辑。例如:

if (uni.getSystemInfoSync().platform === 'ios') {
  // iOS 平台的特殊处理
} else {
  // Android 平台的特殊处理
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!