Electron鸿蒙化的又一个坑

鸿蒙申请权限踩的坑

大家好,我是程序员Aaron。近期在忙音频项目鸿蒙化的过程中,遇到了一个比较怪异的问题:使用Electron鸿蒙化模板编译出来的产物,在index.js中配置了app.whenReady().then(requestPermissions)。首次启动时会正常弹出用户协议弹窗,但申请录音权限的弹窗却不会主动弹出,需要先结束进程重新进入才能触发。初次排查时,怀疑是因为用户协议弹窗覆盖导致录音权限弹窗被遮挡,但进一步排查未果。

问题复现及沟通情况

  • 与开发者联盟的交流: 这个问题跨越了近两周,期间进行了多次讨论,但最终因为开发者联盟测试环境未出现隐私协议弹窗从而无法完美复现问题,故暂时搁置。
  • 解决方案试探: 暂时休息了一部分时间,考虑到在录音开始前而不是启动时请求权限可能会解决问题,并尝试通过Vue的预加载脚本进行交互。

当前的实现方案

为了确保录音权限申请逻辑在录音开始时生效,而不是启动时,我们采用了以下方案:

  1. Vue层: 在用户点击录音按钮时检查录音权限,并通过预加载脚本向Electron层发送请求。

  2. IPC通信:

    • index.js: 使用ipcMain监听录音开始事件,并通过requestPermissions请求权限,然后通过事件回应对Vue层返回结果。
    csharp 复制代码
    ipcMain.on('record-started', async (event) => {
        await requestPermissions().then(result => event.reply('permission-granted', result))
    })
  3. preload.js: 用于Electron和Vue层之间的通信。

    javascript 复制代码
    export function recordStarted() {
        ipcRenderer.send('record-started')
    }
    
    export function permissionGranted(callback) {
        ipcRenderer.on('permission-granted', callback)
    }
  4. AudioEase.js: 负责录音相关操作的Vue脚本。

    ini 复制代码
    try {
        let permission = false;
        window.electronAPI.recordStarted();
        window.electronAPI.permissionGranted(async (event, result) => {
            if (result) await startWavesurferRecording();
        });
    
        if (!permission) {
            setShowMessage(`录音失败`, 'error');
            isRecording.value = false;
            recordingStatus.value = '录音失败';
        }
      
    } catch (error) {
        console.error('录音失败:', error);
        setShowMessage(`录音失败: ${error.message}`, 'error');
        isRecording.value = false;
        recordingStatus.value = '录音失败';
    }

总结

这个方案是为了确保在用户实际录音开始时申请录音权限,而非在应用启动时。希望这段代码能帮到一些正在进行或计划进行Electron鸿蒙化的小白们。感谢大家的关注和支持,希望下次相见!

相关推荐
用户8471810541913 分钟前
LangChain中间件教程及DeepAgents应用
javascript·agent
huabuyu17 分钟前
INP 自动化归因与自愈:如何自动定位、修复并验证一次卡顿
前端·javascript
BreezeJiang24 分钟前
浏览器里的 DeepSeek 到底怎么跑起来?关键在 Worker、缓存和流式消息
javascript
BreezeJiang28 分钟前
单例模式真正解决的不是“只能 new 一次”,而是统一资源入口
javascript
小林ixn31 分钟前
WebGPU + Transformers.js:把 DeepSeek-R1 塞进浏览器,真香!
javascript·llm·gpu
xiaominlaopodaren31 分钟前
three.js地图数学基础(四):瓦片金字塔
javascript·gis·three.js
mONESY38 分钟前
🔥 React Hooks 进阶实战:受控组件 + 性能优化一站式掌握
javascript
Synmbrf42 分钟前
flv播放设置hasAudio为true黑屏
javascript
看到我请叫我铁锤1 小时前
vue编写web端在线预览文档
前端·javascript·vue.js
ssshooter1 小时前
为什么明明只有一个 12px 的小元素,父容器却有 63px 高?
前端·javascript·面试