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

相关推荐
mldong4 分钟前
给流程设计器加国际化,我没引 vue-i18n
前端·javascript·vue.js
开开心心就好6 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
默_笙10 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan12 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
天若有情67314 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具
林语琛15 小时前
我写的 switch…break 被 Babel 偷偷吞了
前端·javascript·babel
liuchangng15 小时前
Jev 模型研究:从生成式大模型到决策式模型——System One、RLCD 校准与采用边界
java·javascript·人工智能·python·深度学习
我命由我1234516 小时前
CSS - CSS 媒体查询 orientation
前端·javascript·css·html·css3·html5·js
志尊宝19 小时前
Vue3 零基础每日笔记(048):嵌套路由与命名视图——后台管理系统布局雏形
前端·javascript·vue.js·笔记·html5
@tangguo12320 小时前
npm 和 yarn 配置说明
前端·javascript·npm·node.js·yarn