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

相关推荐
张元清2 小时前
驯服 React 里的 DOM 事件:useEventListener、useEventEmitter、useKeyModifier、useTextSelect
前端·javascript·面试
古韵2 小时前
�������� JavaScript �հ�����ԭ����ʵս
javascript
代码熊崽的编程森林3 小时前
vue + onlyoffice 自定义插件的实现(OnlyOffice 插件:AI 智能编辑)。
前端·javascript·vue.js
Lucky_Turtle3 小时前
【Vue】element plus Slider小数组件设置顺滑程度
前端·javascript·vue.js
Dxy12393102164 小时前
js中Math.min.apply()详解
开发语言·javascript
砍材农夫4 小时前
物联网 基于netty控制报文结构(发布与接收)
java·开发语言·前端·javascript·物联网
上单带刀不带妹4 小时前
Vue3 中 getCurrentInstance() 与 proxy 详解
前端·javascript·vue.js
妄念鹿5 小时前
记一次Uniapp的input输入框type为number时还能输入非数字
前端·javascript
武当王丶也5 小时前
React Native App 内更新实践:从版本策略到 APK 下载和安装
android·javascript·react native
ZTStory5 小时前
Volta 新一代 node 版本管理工具
前端·javascript·node.js