uni-app中uni.getRecorderManager()在鸿蒙平台存在问题

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

uni-app中uni.getRecorderManager()在鸿蒙平台存在问题

结束录音后,onStop事件执行次数累积增加,比如第一次stop,onStop事件执行了一次,第二次stop,onStop事件执行了两次,第三次stop,onStop事件执行了3次。导致我第二次发送语音会一次性发出两条,第三次会发出3条....依次类推。安卓和IOS同样的代码经过测试没有这个问题。当前是用mete60真机,HBX版本4.36。

开发环境 版本号 项目创建方式
mete60 HBX 4.36 -

更多关于uni-app中uni.getRecorderManager()在鸿蒙平台存在问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

17 回复

有没有什么临时解决的方案?

更多关于uni-app中uni.getRecorderManager()在鸿蒙平台存在问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


没有代码无法排查,猜测你是每次都执行了一次 onStop 监听,你先把每次都监听的逻辑改一下,我也调整下代码

回复 DCloud_UNI_LXH: 是的,每次都执行了onStop

回复 DCloud_UNI_LXH: 我给您写了个案例可以试下。个人感觉问题是录音这个API在返回上级页面的时候没有卸载。

由于平台上传文件大小限制,没法传完整的uniapp项目,下面是两个页面,需要从index.vue跳转到testRecord.vue页面。

测试流程:从index.vue跳转到testRecord.vue,进行录音操作(第一次正常),然后返回到index页面,再进testRecord页面,再进行录音操作,这次会出现问题(onStop里面打印了两次),如果继续执行这一整套操作,下次会打印三次,以此累加…

先从逻辑上不要每次都执行 onStop。下次发版会带上这个问题的修复

不知道您理解的问题是不是和我一样。我之前是在一个页面里把onStop重复执行了,后来我给onStop放到onload里去了,第一次进来确实就正常了,但是返回上一个页面再进来这个页面就出现问题了。

您说的临时解决方案让我不要每次都执行onStop,是要让我设置全局来判断?每次运行APP只执行一次onStop吗?

回复 Adlaw: 我下面有一个临时解决方案。你也可以在逻辑上使用一个变量来在 onStop 内部进行监听。按一次按钮只能执行一次

临时解决方案

Mac 找到 HBuilderX-Alpha.app/Contents/HBuilderX/plugins/launcher-harmony/base。win 找到 /HBuilderX/plugins/launcher-harmony/base
将 project.zip 解压缩
将这里的 har 包替换

将原来的 project.zip 改名留存。解压缩的 project 文件夹重新压缩替换掉原来的 project.zip
将项目中的 unpackage 删除重新运行到手机

大佬按照这个方法弄完,运行成功,但是应用一点击就闪退

回复 s***@yinmaisoft.com: 刚刚更新的版本是否修复了这个bug

回复 s***@yinmaisoft.com: 没有带这个修复。提供的临时解决方案一运行就闪退?DevEco 中的日志是什么?

是否用了 uni-push 之类需要在 manifest 中勾选的功能?都升级到最新版本,在 ohpm 上搜索。比如

在uni-app中使用uni.getRecorderManager()进行录音功能时,确实可能会遇到一些特定于鸿蒙(HarmonyOS)平台的兼容性问题。以下是一个示例代码,展示了如何在uni-app中实现录音功能,并包含了一些针对鸿蒙平台潜在问题的处理思路。请注意,由于鸿蒙平台的特殊性,这些处理可能需要根据实际情况进行调整。

示例代码

// 引入uni-app录音管理器
const recorderManager = uni.getRecorderManager();

// 配置录音参数
recorderManager.set({
    format: 'mp3', // 设置录音格式为mp3
    sampleRate: 44100, // 设置采样率
    numberOfChannels: 1, // 设置声道数
    encodeBitRate: 192000, // 设置编码码率
    metering: true // 开启音量监测
});

// 开始录音
recorderManager.start({
    success: function () {
        console.log('录音开始');
    },
    fail: function (err) {
        // 针对鸿蒙平台可能的问题进行特殊处理
        if (uni.getSystemInfoSync().platform === 'harmonyos') {
            console.error('鸿蒙平台录音失败:', err);
            // 可尝试重新初始化录音管理器或提示用户检查权限
            // recorderManager.destroy(); // 销毁录音管理器实例
            // recorderManager = uni.getRecorderManager(); // 重新获取实例
            // 提示用户检查录音权限
            uni.showModal({
                title: '提示',
                content: '请在设置中检查录音权限',
                showCancel: false
            });
        } else {
            console.error('录音失败:', err);
        }
    }
});

// 监听录音数据
recorderManager.onDataChunk(function (res) {
    console.log('录音数据块:', res.data);
    // 可以将res.data保存到本地或进行其他处理
});

// 停止录音
function stopRecording() {
    recorderManager.stop({
        success: function (res) {
            console.log('录音停止,临时文件路径:', res.tempFilePath);
            // 处理录音文件,如上传或保存到本地
        },
        fail: function (err) {
            console.error('停止录音失败:', err);
        }
    });
}

// 监听停止录音按钮点击事件(示例)
document.getElementById('stopBtn').addEventListener('click', stopRecording);

注意事项

  1. 权限检查:确保在鸿蒙平台上已正确申请并授予录音权限。
  2. 平台判断:通过uni.getSystemInfoSync().platform判断当前平台,对鸿蒙平台进行特殊处理。
  3. 错误处理:在录音的fail回调中,针对鸿蒙平台可能的问题进行日志记录或用户提示。
  4. 资源管理:在录音过程中,注意资源的管理和释放,避免内存泄漏。

以上代码提供了一个基本的录音功能实现,并针对鸿蒙平台可能遇到的问题进行了处理思路的展示。实际开发中,可能需要根据具体需求和鸿蒙平台的特性进行进一步的优化和调整。

回到顶部