从Chrome扩展访问USB设备或从Web页面与Chrome应用通信

7
我知道我们可以在Chrome应用程序中使用chrome.hid.getDevices(),但我也听说chrome.hid.getDevices()只能在Chrome应用程序中使用。
不过,我们是否可以在Chrome扩展中以某种方式访问chrome.hid.getDevices()呢? 因为我需要使用Content-script注入脚本,以便我可以从Web页面使用我的扩展功能,并且根据我的了解,Content-script只能在Chrome扩展中使用。
有没有任何示例可以用来与Web页面通信的Chrome应用程序呢?
3个回答

1

既然应用可以访问USB设备,而扩展程序可以向网页注入脚本,为什么不同时维护两者呢?您可以使用消息传递来建立扩展程序和应用之间的连接,例如 chrome.runtime.sendMessagechrome.runtime.connect

上述两种方法的第一个参数是 extensionId,可以设置为外部扩展程序/应用的ID。


有示例吗?或者范例? - Waqar Ahmed
@WaqarAhmed,请看Xan的回答,我对谷歌应用一无所知。 - Haibara Ai

1
如果您想直接从网站代码调用函数,您不需要扩展程序/内容脚本作为代理。
可以在"externally_connectable"清单键中列出特定域以便能够启动与应用的消息传递
之后:
  • 网页可以使用应用程序ID调用chrome.runtime.sendMessage().connect()
  • 应用程序将收到chrome.runtime.onMessageExternalonConnnectExternal事件。
如果在事件页面注册了这些事件的监听器,则即使未启动应用程序,它也会被唤醒以处理它们。

1
最好的方法是创建一个C#应用程序(或者其他支持与Chrome扩展程序进行本机消息传递的语言),就像在这个Google示例中所示的那样。
这允许您从Chrome向您的应用程序发送消息并检索结果(例如可以传递的JSON数据或其他内容)。
当我遇到类似于您需要查询本地数据库的情况时,我创建了一个NodeJS应用程序,您可以从扩展程序中查询,例如localhost:4949/usb?slot=1,而NodeJS应用程序本身访问USB或其他受限制的内容,获取所需的任何数据,并使用REST API将其作为结果返回。
我不喜欢扩展程序和应用程序之间的本机消息传递的想法,因此NodeJS服务器是一个不错的解决方案。它也可以通过IPv4 IP(例如192.168.0.16:4949)在本地网络上运行。
如果需要,我可以提供更好的示例。

嗯...如果这被证明是最好的答案,那将会非常令人失望。我希望有人能找到一种方法使得像WebUSB、chrome.hid或者chrome.usb这样的可移植性工具在Chrome扩展上下文中运行。 - James_pic
非常不可能,因为Chrome是基于开源项目Chromium的,所以您需要在Chromium上发布问题。设置NodeJS后端实际上非常容易,而且在我看来这是最简单的方法。 - Cacoon
我做了这个:https://bugs.chromium.org/p/chromium/issues/detail?id=823736。他们决定不予修复。这个问题的背景是为MetaMask添加Ledger支持,您提出的选项是我们已经考虑过并且决定不适用的选项(https://github.com/MetaMask/metamask-extension/issues/4204#issuecomment-394193271)。我在这个问题上添加了一个赏金,希望有人知道更好的方法(已经有几种方法可以从网页使用USB,但是令人难以置信的是,它们都不能在扩展中工作),但看起来可能没有更好的方法了。 - James_pic
1
是的,我认为这些有用的东西的支持确实缺乏。而且支持似乎不断被撤回。 - Cacoon
1
此项目使用Chrome扩展程序+本地消息传递:https://github.com/gnaudio/jabra-browser-integration - Morten Frederiksen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接