Electron加载HTTP页面打开本地摄像头

Chrome浏览器调用本地摄像头安全策略

Chrome浏览器在46版本后,对于摄像头的调用更加严格,默认情况下,只允许三种调用方式:
1.https协议打开的页面;
2.客户端本地启动服务的页面,即localhost打开的页面;
3.直接打卡客户端本地文件,即file:///协议打开的文件;
http协议打开的远端页面不允许访问摄像头,调用navigator.mediaDevices时返回undefined。

Chrome使用http协议打开的远端页面如何调用摄像头

新版Chrome提供了实验性功能,unsafely-treat-insecure-origin-as-secure属性,可以将开发人员设置的白名单地址定义为安全链接(http://IP:Port),从而可以实现http协议打开的远端页面调用客户端摄像头,具体实现方式如下:
在地址栏输入chrome://flags/, 搜索unsafely,将需要加入白名单的地址填入,并将右侧下拉框选为Enabled
在这里插入图片描述
注意,确保摄像头没有被操作系统禁用,设置完成后,重启Chrome,此时,加入白名单的远端页面就可以调用客户端本地摄像头了。

Electron启动的Chromium窗口中,如何使用HTTP协议打开摄像头

下面是重点,本以为在Chrome测试http成功后,使用Electron可以一帆风顺,用以下代码设置unsafely-treat-insecure-origin-as-secure属性:

app.commandLine.appendSwitch('unsafely-treat-insecure-origin-as-secure', 'http://IP:Port');

启动页面后,调用navigator.mediaDevices时仍旧返回undefined,无法访问客户端摄像头,查询原因,Electron并不支持unsafely-treat-insecure-origin-as-secure这个属性,github很多人问过类似问题,都是尝试失败
链接如下:
https://github.com/electron/electron/issues/15298.

要继续寻找别的办法了,在github看到一个帖子的回复,使用Electron提供的protocol接口,注册自定义协议并拦截基于现有协议的请求,直接线上代码

protocol.registerSchemesAsPrivileged([
    {
      scheme: 'http', 
      privileges: {
        bypassCSP: true,
        secure: true,
        supportFetchAPI: true,
        corsEnabled: true
      }
    }
  ]);

在 app 的 ready 事件触发调用一次该方法,对http协议赋予特权,将其定义为安全的协议,此时,再启动的Chromium窗口,使用http协议打开的远端页面,就被浏览器认为是安全的,可以调用客户端本地摄像头了。
详细的说明可以参考Electron官方文档:
https://www.electronjs.org/docs/api/protocol.

希望本文对你有所帮助。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Electron 中可以使用预加载脚本来在渲染进程运行之前执行一些操作,例如加载某些模块或设置全局变量。预加载脚本的代码可以在主进程中执行,也可以在单独的 JS 文件中编写,然后在 `BrowserWindow` 中指定。 以下是一个使用预加载脚本的例子: 在主进程中: ```javascript const { app, BrowserWindow } = require('electron') const path = require('path') function createWindow () { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js') // 指定预加载脚本 } }) // 加载应用程序主页面 win.loadFile('index.html') } app.whenReady().then(() => { createWindow() app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow() } }) }) app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit() } }) ``` 在 `BrowserWindow` 的 `webPreferences` 中指定了预加载脚本的路径,它会在渲染进程运行之前加载并执行。在本例中,预加载脚本为 `preload.js`。 在 `preload.js` 文件中,可以编写一些代码来执行一些操作。例如,可以在其中加载 Node.js 模块或设置全局变量。以下是一个简单的例子: ```javascript const { remote } = require('electron') window.addEventListener('DOMContentLoaded', () => { const currentWindow = remote.getCurrentWindow() currentWindow.setTitle('My App') // 设置窗口标题 }) ``` 在本例中,我们使用 `remote` 模块获取当前窗口,并设置窗口标题为 "My App"。 需要注意的是,预加载脚本中的代码可以访问 Node.js 的 API,但不能访问渲染进程的 DOM。如果需要与渲染进程进行通信,可以使用 Electron 的 IPC 功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值