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

SWT Browser中JavaScript调用摄像头功能失效问题求助

SWT Browser摄像头调用失效问题

我在SWT Browser中打开本地网站时,页面调用摄像头的功能失效,但在Chrome浏览器中操作正常(会弹出授权提示)。以下是相关代码和依赖:

代码实现

public class SWTBrowser {

    private static Display display;
    private static Shell shell;

    /**
     * Launch
     */
    public static final void launch() {
        display = new Display();

        shell = new Shell(display);
        Rectangle clientArea = display.getClientArea();

        shell.setSize(clientArea.width, clientArea.height);

        shell.setLocation(0, 0);
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 3;
        gridLayout.marginWidth = 0;
        gridLayout.marginHeight = 0;
        shell.setFullScreen(false);

        shell.setLayout(gridLayout);
        
        Browser browser = new Browser(shell, SWT.NONE);
        browser.setJavascriptEnabled(true);

        GridData data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        data.verticalAlignment = GridData.FILL;
        data.horizontalSpan = 3;
        data.grabExcessHorizontalSpace = true;
        data.grabExcessVerticalSpace = true;
        data.widthHint = clientArea.width;
        data.heightHint = clientArea.height;
        browser.setLayoutData(data);

        shell.open();
        browser.setUrl("http://localhost:" + Constants.SERVER_PORT + "/portal/dashboard.jsf");

        
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

    //////////////////////
    //// Getter + Setter
    //////////////////////

    public static Display getDisplay() {
        return display;
    }

    public static void setDisplay(Display display) {
        SWTBrowser.display = display;
    }

    public static Shell getShell() {
        return shell;
    }

    public static void setShell(Shell shell) {
        SWTBrowser.shell = shell;
    }
}

POM依赖

<dependency>
    <groupId>org.eclipse.platform</groupId>
    <artifactId>org.eclipse.swt.cocoa.macosx.x86_64</artifactId>
    <version>3.120.0</version>
</dependency>

解决办法
  • 检查系统摄像头权限
    SWT Browser基于Mac的WebKit引擎,需确保应用获得系统摄像头授权:

    1. 打开「系统偏好设置」→「安全性与隐私」→「摄像头」
    2. 找到你的Java应用(或打包后的程序),勾选允许访问摄像头
    3. 若列表无该应用,先运行一次触发权限请求,未弹出则手动添加
  • 升级SWT版本
    你当前使用的3.120.0版本较旧,后续版本优化了WebKit媒体权限处理。建议升级到最新稳定版,更新POM依赖:

    <dependency>
        <groupId>org.eclipse.platform</groupId>
        <artifactId>org.eclipse.swt.cocoa.macosx.x86_64</artifactId>
        <version>4.26</version>
    </dependency>
    
  • 明确指定WebKit引擎初始化Browser
    替换原Browser初始化代码,显式指定WebKit引擎,确保媒体权限逻辑生效:

    Browser browser = new Browser(shell, SWT.WEBKIT);
    
  • 检查页面权限错误处理
    在网页的摄像头调用代码中添加错误捕获,排查是否为权限拒绝导致:

    navigator.mediaDevices.getUserMedia({ video: true })
      .then(stream => { /* 处理视频流 */ })
      .catch(err => {
        console.error("摄像头访问失败:", err);
        // 提示用户检查系统权限
      });
    
  • 应用签名(打包场景)
    若应用打包为DMG/App文件,未签名会被系统限制权限,需完成代码签名流程,确保权限请求正常触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:24:25