uni-app 连续录音上传导致app闪退
uni-app 连续录音上传导致app闪退
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Mac | 14.2.1 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Mac
HBuilderX类型:正式
HBuilderX版本号:4.07
手机系统:Android
手机系统版本号:Android 12
手机厂商:华为
手机机型:华为p50
页面类型:vue
vue版本:vue2
打包方式:离线
示例代码:
2024-03-28 16:17:07.954 1344-19989 AudioPolicyIntefaceImpl audioserver E release_Input mAudioRecordClients.valueAt(index) is nullptr start
2024-03-28 16:17:07.954 1344-19989 AudioPolicyIntefaceImpl audioserver E release_Input mAudioRecordClients.valueAt(index) is nullptr end
2024-03-28 16:17:07.954 1344-19989 AudioPolicyIntefaceImpl audioserver E release_Input client->active start
2024-03-28 16:17:07.954 1344-19989 AudioPolicyIntefaceImpl audioserver E release_Input isMsdp is false
2024-03-28 16:17:07.954 1344-19989 AudioPolicyIntefaceImpl audioserver E release_Input client == 0 start
2024-03-28 16:17:07.954 1344-19989 AudioPolicyIntefaceImpl audioserver E release_Input client == 0 end
2024-03-28 16:17:07.954 1344-19989 AudioPolicyIntefaceImpl audioserver E release_Input audioPolicyEffects != 0
3 回复
我也遇到了,闪退没信息
遇到加一
在 uni-app 中,连续录音并上传可能会导致应用闪退,这通常是由于内存泄漏、资源未及时释放或录音文件过大等问题引起的。以下是一些可能的原因和解决方法:
1. 内存泄漏
连续录音时,如果录音对象或相关资源没有及时释放,可能会导致内存占用过高,最终导致应用闪退。
解决方法:
- 确保每次录音结束后调用
recorderManager.stop()
和recorderManager.destroy()
,释放录音资源。 - 检查是否有全局变量或未释放的引用导致内存泄漏。
const recorderManager = uni.getRecorderManager();
recorderManager.onStop((res) => {
console.log('录音停止', res.tempFilePath);
// 上传录音文件
uploadAudio(res.tempFilePath);
});
// 开始录音
recorderManager.start();
// 停止录音并释放资源
recorderManager.stop();
2. 录音文件过大
如果录音时间过长,生成的音频文件可能过大,上传时可能导致内存不足或网络请求超时,进而引发闪退。
解决方法:
- 限制单次录音时长,例如每次录音不超过 60 秒。
- 压缩录音文件后再上传,可以使用第三方库(如
lamejs
)将音频文件压缩为 MP3 格式。
recorderManager.start({
duration: 60000, // 限制录音时长为 60 秒
});
3. 频繁上传导致网络请求堆积
如果连续录音并频繁上传,可能会导致网络请求堆积,占用大量资源,最终导致应用闪退。
解决方法:
- 控制上传频率,例如每次录音结束后等待一段时间再上传。
- 使用队列机制,将录音文件存储到队列中,按顺序上传。
const uploadQueue = [];
function uploadAudio(filePath) {
uploadQueue.push(filePath);
if (uploadQueue.length === 1) {
processUploadQueue();
}
}
function processUploadQueue() {
if (uploadQueue.length === 0) return;
const filePath = uploadQueue[0];
uni.uploadFile({
url: 'https://example.com/upload',
filePath: filePath,
name: 'file',
success: () => {
uploadQueue.shift();
processUploadQueue();
},
fail: () => {
uploadQueue.shift();
processUploadQueue();
},
});
}
4. 录音权限问题
如果录音权限未正确获取或处理,可能会导致录音失败或应用闪退。
解决方法:
- 确保在录音前获取麦克风权限。
- 处理权限被拒绝的情况,避免应用崩溃。
uni.authorize({
scope: 'scope.record',
success: () => {
recorderManager.start();
},
fail: () => {
uni.showToast({
title: '请授予录音权限',
icon: 'none',
});
},
});