You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome Manifest V3调用chrome.desktopCapture.chooseDesktopMedia崩溃如何解决?

问题原因

该崩溃问题本质是Manifest V3的后台运行环境变更导致的API调用不兼容:

  1. Manifest V3中扩展的后台脚本运行在Service Worker环境下,无DOM上下文与UI渲染宿主,而chrome.desktopCapture.chooseDesktopMedia需要弹出系统级屏幕选择窗口,依赖可交互的UI上下文支撑,直接在无界面的Service Worker中调用会导致Chrome尝试向不存在的渲染内存地址写入数据,触发你观测到的0xC0000005内存访问越界异常。
  2. 你的测试代码存在笔误:回调参数定义为streamID,但打印的是未定义的id变量,不过该问题不会触发浏览器崩溃,仅会导致后续执行报错。

解决方案

1. 调整API调用的运行环境

禁止在background service worker中直接调用chooseDesktopMedia,将调用逻辑迁移到以下有DOM上下文的环境中:

  • 扩展的弹窗页面(popup.js)
  • 扩展的自定义选项页/侧边栏页面
  • 注入到网页的content script(需匹配对应站点的host权限)

2. 适配后台触发的录制需求

如果必须由后台逻辑触发录制流程,采用间接调用方案:

// background.js 触发逻辑
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg.type === 'streamIdObtained') {
    const streamId = msg.data
    // 后续录制逻辑处理
  }
})
// 需要触发录制时先打开弹窗
chrome.action.openPopup()
// popup.js 调用逻辑
// 建议绑定用户点击事件触发,避免Chrome拦截静默调用
document.querySelector('#startCaptureBtn').addEventListener('click', () => {
  chrome.desktopCapture.chooseDesktopMedia(["screen"], (streamID, options) => {
    console.log(streamID)
    // 回传streamId给background
    chrome.runtime.sendMessage({
      type: 'streamIdObtained',
      data: streamID
    })
    // 可选:自动关闭弹窗
    window.close()
  })
})

3. 补充manifest配置(可选)

如果需要在content script中调用该API,需要在manifest中额外配置对应站点的host权限:

"host_permissions": [
  "<all_urls>"
]

内容的提问来源于stack exchange,提问作者StevenDStanton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:15:02