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 | |

[App下载地址或H5网址](https://www.pgyer.com/GfNB)
更多关于uni-app 平板(安卓6)录音过程中重启或杀进程 后续录音都会录到第一个文件内的实战教程也可以访问 https://www.itying.com/category-93-b0.html
麻烦提供一下代码,我这边无法复现。
更多关于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 系统(特别是低版本)会认为该录音会话仍在进行,后续所有录音操作都会继续写入同一个未关闭的文件中。
临时解决方案:
-
异常处理中强制停止录音: 在应用生命周期事件(如
onHide、onUnload)或全局错误捕获中,尝试调用stop()并销毁实例:// 在页面卸载或应用隐藏时 onUnload() { if (window.__audioRecorder) { window.__audioRecorder.stop(); window.__audioRecorder = null; } } -
录音前先重置状态: 每次开始录音前,先尝试停止可能存在的旧实例:
const startRecord = () => { // 先停止可能存在的残留录音 try { const oldRecorder = plus.audio.getRecorder(); oldRecorder.stop(); } catch(e) {} // 创建新实例 const recorder = plus.audio.getRecorder(); window.__audioRecorder = recorder; recorder.record(...); } -
使用条件编译避免低版本 Android 问题:
// #ifdef APP-PLUS if (plus.os.name === 'Android' && parseInt(plus.os.version) < 7) { // 低版本 Android 特殊处理 this.useFallbackRecord = true; } // #endif

