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鸿蒙化的小白们。感谢大家的关注和支持,希望下次相见!

相关推荐
daols887 小时前
vxe-table 渲染器教程一:实现金额输入控件
javascript·vue.js·vxe-table
触底反弹8 小时前
🔥 React 零基础入门(中):500 行屎山代码到组件化的蜕变
前端·javascript·react.js
张元清12 小时前
React useResizeObserver Hook:追踪元素尺寸变化(2026)
javascript·react.js
瑞瑞小同学15 小时前
处理echarts x轴内容过多,重叠问题
前端·javascript·echarts
像我这样帅的人丶你还15 小时前
MCP + npm:给五年前的老系统接上AI
前端·javascript·agent
一个写前端的17 小时前
基于 Vue 3 的大文件分片上传组件,支持断点续传、并发上传、失败重试等功能
前端·javascript·vue.js
猫头_17 小时前
AI 流式传输工程指南:有了 EventSource 为何还要 Fetch?
javascript·http·llm
良木林18 小时前
滑动窗口 - LeetCode hot 100
javascript·算法·leetcode·双指针·滑动窗口
不简说20 小时前
# JS 代码技巧 vol.7 — 20 个浏览器 API 实战,自带 API 能干的事别自己封装
前端·javascript·面试
Hilaku20 小时前
为什么 Cloudflare 能做到毫秒级冷启动,而其它云厂商却不行?
前端·javascript·程序员