【问题标题】:Capture chrome tab without browse action无需浏览操作即可捕获 chrome 选项卡
【发布时间】:2016-06-29 08:34:24
【问题描述】:

我有一个捕获当前选项卡的简单方法,它仅在通过单击扩展按钮(即 browserAction)触发此方法时才有效。

但是当我在 setTimeout 事件中使用此方法时,它会失败并出现以下错误:

Unchecked runtime.lastError while running tabCapture.capture: Extension has not been invoked for the current page (see activeTab permission). Chrome pages cannot be captured.

我的简单捕获方法是:

function captureTab() {
    var constraints = ...
    chrome.tabCapture.capture(constraints, function (stream) {
        if (!stream) {
            console.error("couldn't record tab");
            return;
        }
        // recording succeeded
    });
} 

当它触发时它的工作原理如下:

chrome.browserAction.onClicked.addListener(function () {
    chrome.tabs.getSelected(null, function (tab) {
        captureTab();
    });
});

不起作用触发时如下:

setTimeout(function () {
    chrome.tabs.getSelected(1, function (tab) {
        captureTab();            
    });
}, 1 * 30 * 1000);

重要提示:我的扩展程序不是公共扩展程序,它仅在我的浏览器上运行,因此如果需要,我可以在启动时添加任何命令行开关(以禁用此限制)。

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension chromium


    【解决方案1】:

    请注意chrome.tabCapture.capture 只能在调用扩展程序后在当前活动的选项卡上启动。

    捕获当前活动选项卡的可见区域。调用扩展后,只能在当前活动的选项卡上开始捕获。

    当你声明activeTab权限时,只有以下用户手势启用它

    • 执行浏览器操作
    • 执行页面操作
    • 执行上下文菜单项
    • 从命令 API 执行键盘快捷键
    • 接受来自多功能框 API 的建议

    因此,当您使用setTimeOut 时,您无法确保当前选项卡处于活动状态。

    【讨论】:

    • 你说得对。没有任何方法可以做到这一点。但是,因为在我的情况下,我从外部应用程序以编程方式启动 chrome,所以我在键盘快捷键的扩展中设置了一个侦听器(使用命令 API),然后从我的外部应用程序触发这个键盘快捷键。还是谢谢。
    【解决方案2】:

    我知道这很奇怪,我在接受了不同的答案后才回答自己的问题,但是...

    我有一个解决方案,只有当您可以将 switch 注入到 chrome 时才能应用,这在我的情况下是可能的,正如我上面提到的:

    重要提示:我的扩展程序不是公共扩展程序,它仅在我的浏览器上运行,因此如果需要,我可以在启动时添加任何命令行开关(以禁用此限制)。

    所以诀窍是使用以下开关和您的扩展程序 ID:

    --whitelisted-extension-id="abcdefghijklmnopqrstuvwxyz"
    

    希望有一天这会对某人有所帮助。

    【讨论】:

    • 这对我有用。如果扩展是您本地的,则可以使用。
    【解决方案3】:

    有效的方法是调用您的扩展程序的用户操作(有人点击告诉 Chrome 没问题的东西,因为用户想要它)。

    这会暂时授予扩展“activeTab”权限,这就是它工作的原因。 (https://developer.chrome.com/extensions/activeTab)

    为了让它像你想要的那样工作(没有自动引入 activeTab 权限的操作),你需要在扩展的权限部分中声明它,例如:

    "permissions": [
      "tabs",
      "bookmarks",
      "http://www.blogger.com/",
      "http://*.google.com/",
      "unlimitedStorage",
      "activeTab"
    ],
    

    https://developer.chrome.com/extensions/declare_permissions

    【讨论】:

    • 我向清单文件添加了所有可能的权限,但它仍然不允许我在没有浏览操作的情况下运行它。
    • 嗯,错误消息本身指向未设置 activeTab 权限,我显示的链接说明了为什么它可以使用一个,而不是另一个。我正在想办法让你的第二种方法发挥作用;您是否尝试过使用developer.chrome.com/apps/alarms 而不是 setTimeout?
    • 其实setTimeout只是举例。除了来自用户的触发器之外,它不适用于任何触发。
    • 好吧,如果触发器来自用户,那么 onClicked 应该会自动授予您 activeTab 权限。您可以按原样发布代码而不是示例吗?
    • 我的代码中的触发器是 webSocket 消息。但我也在从注入 js 接收到的 onMessage 事件中尝试了它。
    猜你喜欢
    • 2012-02-10
    • 2016-01-16
    • 2019-02-03
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多