uni-app 连续录音上传导致app闪退

发布于 1周前 作者 wuwangju 来自 Uni-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',
        });
    },
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!