uni-app 平板(安卓6)录音过程中重启或杀进程 后续录音都会录到第一个文件内

uni-app 平板(安卓6)录音过程中重启或杀进程 后续录音都会录到第一个文件内

示例代码:

const r = plus.audio.getRecorder(); r.record

//code

r.stop


## 操作步骤:

复现方式很简单。
使用真机调试,打开录音, 改代码,  reload 后继续录音。 之前的录音没有关闭。(后面所有的录音都录到第一个文件里面了);
杀掉进程 后再次录音也录到第一个文件里面了。

## 预期结果:

不管杀进程还是重启,应该自动关闭或解除录音占用。

## 实际结果:

出现问题后,设备上所有录音应用都无法使用

## bug描述:

平板(安卓6)在录音过程中重启或杀进程。后续录音都会录到第一个文件内。
杀掉进程 后再次录音也录到第一个文件里面了。
重启设备恢复正常。

1. ios 没有问题。
2. 小米11(安卓11)reload两三次后会闪退。 闪退后录音正常
3. 平板(安卓6) 录音过程中杀进程,后续录音都在第一个录音文件里面。(需要重启设备才行,杀进程无效, 系统自带录音也无法使用,如图)

| 开发环境         | 版本号 | 项目创建方式 |
|------------------|--------|--------------|
| PC开发环境操作系统 | Windows |            |
| PC开发环境操作系统版本号 | 3.2.3  |            |
| 手机系统         | Android |            |
| 手机系统版本号   | Android 6.0 |          |
| 手机厂商         | 联想    |            |
| 手机机型         | 平板 Lenovo TB-8703F |        |
| 页面类型         | vue     |            |
| 打包方式         | 云端    |            |
| 项目创建方式     | HBuilderX |          |

![image](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20210922/0eae1af6f9558f3753bd5ff7ca33cd18.jpg)

[App下载地址或H5网址](https://www.pgyer.com/GfNB)

更多关于uni-app 平板(安卓6)录音过程中重启或杀进程 后续录音都会录到第一个文件内的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

麻烦提供一下代码,我这边无法复现。

更多关于uni-app 平板(安卓6)录音过程中重启或杀进程 后续录音都会录到第一个文件内的实战教程也可以访问 https://www.itying.com/category-93-b0.html


发了在下一个回复里面

//测试录音代码 const dir = ‘_doc/fyFile/testAudio/’; const r = plus.audio.getRecorder(); console.log(‘start ok’, ‘------- 修改这里然后ctrl+s ------1’); r.record({ filename: dir }, function® { console.log(‘stop ok’, ‘----------’); }, function(e) { console.log(‘stop err’, ‘----------’); }); setTimeout(() => { //r.stop(); });
//真机调试,每次修改后直接保存就好 。 在平板上代码没有任何报错。直接在文件夹里面看文件的录音时长。除了第一个其他全是0秒

只会在真机调试的时候有问题吗?云打包的apk正不正常?

回复 DCloud_Android_zl: 云打包后的apk 也有这个出现这个症状,但出现原因未知。目前我的解决方案就是把所有的recorder 对象都放在一个数组里面, 退出页面时循环再次执行stop, 保证每次都stop。 后续能不能增加一个 录音状态是否占用的接口? 因为这个问题可能跟机型或系统有关,不好正面解决。 但是哪怕闪退也比不知道有问题好。比如(考试填写的场景,录了10分钟最后发现没有录音,就很尴尬。如果一开始就提示,需要重启或其他操作,就还好)

回复 b***@vip.qq.com: 这个方式也不保险… , 目前是录音开始后 1秒检测时长。最保险,时长低于0.3 那么提示用户重启应用。

这是一个典型的 Android 系统底层音频资源未释放问题,属于原生层(plus.audio)的 bug,在 Android 6 等低版本系统上更容易出现。

问题原因: 当录音进程被异常终止(杀进程、reload)时,plus.audio.getRecorder() 创建的录音实例可能没有正确调用 stop() 方法,导致系统音频设备(麦克风)和录音文件句柄未被释放。Android 系统(特别是低版本)会认为该录音会话仍在进行,后续所有录音操作都会继续写入同一个未关闭的文件中。

临时解决方案:

  1. 异常处理中强制停止录音: 在应用生命周期事件(如 onHideonUnload)或全局错误捕获中,尝试调用 stop() 并销毁实例:

    // 在页面卸载或应用隐藏时
    onUnload() {
      if (window.__audioRecorder) {
        window.__audioRecorder.stop();
        window.__audioRecorder = null;
      }
    }
    
  2. 录音前先重置状态: 每次开始录音前,先尝试停止可能存在的旧实例:

    const startRecord = () => {
      // 先停止可能存在的残留录音
      try {
        const oldRecorder = plus.audio.getRecorder();
        oldRecorder.stop();
      } catch(e) {}
      
      // 创建新实例
      const recorder = plus.audio.getRecorder();
      window.__audioRecorder = recorder;
      recorder.record(...);
    }
    
  3. 使用条件编译避免低版本 Android 问题

    // #ifdef APP-PLUS
    if (plus.os.name === 'Android' && parseInt(plus.os.version) < 7) {
      // 低版本 Android 特殊处理
      this.useFallbackRecord = true;
    }
    // #endif
回到顶部