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

Webgazer.js在原生Android应用失效,是否需开发Capacitor插件?

解决Webgazer.js在Capacitor原生Android应用中失效的问题

优先尝试:无需开发插件的解决方案

Webgazer.js依赖浏览器getUserMedia API访问摄像头,在Capacitor原生App的WebView环境中,多数情况是权限或WebView配置问题导致失效,先排查以下几点:

  • 确保摄像头权限配置完整

    1. 在android/app/src/main/AndroidManifest.xml中添加权限声明:
      <uses-permission android:name="android.permission.CAMERA" />
      <uses-feature android:name="android.hardware.camera" android:required="true" />
      <uses-feature android:name="android.hardware.camera.autofocus" />
      
    2. 在JS代码中主动请求运行时权限,借助Capacitor的Permissions API:
      import { Permissions } from '@capacitor/core';
      
      async function requestCameraPermission() {
        const result = await Permissions.request('camera');
        if (result.state !== 'granted') {
          throw new Error('摄像头权限未授予');
        }
      }
      
      需在App启动或Webgazer初始化前调用该方法。
  • 调整WebView的媒体相关配置
    在Android项目的MainActivity.java中,修改WebView设置,允许自动播放媒体和访问摄像头:

    import android.webkit.WebSettings;
    import com.getcapacitor.BridgeActivity;
    
    public class MainActivity extends BridgeActivity {
      @Override
      public void onResume() {
        super.onResume();
        if (this.getBridge().getWebView() != null) {
          WebSettings settings = this.getBridge().getWebView().getSettings();
          // 允许媒体播放无需用户手势触发
          settings.setMediaPlaybackRequiresUserGesture(false);
          // 启用JavaScript(默认已开启,确保配置正确)
          settings.setJavaScriptEnabled(true);
          // 允许访问设备媒体
          settings.setAllowContentAccess(true);
          settings.setAllowFileAccess(true);
        }
      }
    }
    
  • 修正Webgazer初始化时机与配置

    1. 确保在Capacitor的DOMContentLoaded事件或Ionic的platform.ready()之后再初始化Webgazer,避免WebView未完全加载:
      document.addEventListener('DOMContentLoaded', async () => {
        await requestCameraPermission();
        // 初始化Webgazer
        webgazer.setRegression('ridge')
                .setTracker('clmtrackr')
                .begin();
      });
      
    2. 检查Webgazer绑定的video元素是否正确,可给元素设置明确宽高确保正常渲染。

当以上方法无效时:开发Capacitor插件的方案

如果WebView的限制无法绕过(比如Webgazer在WebView中性能不佳,或部分设备getUserMedia存在兼容性问题),可以开发Capacitor插件作为JS与原生Android的桥接层:

  • 插件核心思路

    1. 原生Android层:用CameraX或Camera2 API直接获取摄像头帧,借助Android ML Kit或第三方眼动追踪库处理图像,提取眼睛坐标。
    2. JS层:调用插件提供的方法,接收原生层传来的坐标数据,替代Webgazer原有的摄像头获取与追踪逻辑。
  • 插件开发步骤

    1. 用Capacitor CLI生成插件模板:npx @capacitor/cli plugin generate
    2. 在Android插件代码中实现摄像头帧捕获与眼动追踪逻辑,通过PluginCall将结果回调给JS。
    3. 在JS代码中调用插件方法,将获取到的坐标传入Webgazer(或直接用坐标实现业务逻辑)。

调试建议

  • 用Chrome远程调试工具(chrome://inspect)连接原生App的WebView,查看控制台报错信息,定位是权限问题、Webgazer初始化失败还是其他错误。
  • 单独测试WebView中的getUserMedia是否能正常获取摄像头流,排除Webgazer本身的问题:
    async function testCamera() {
      const stream = await navigator.mediaDevices.getUserMedia({ video: true });
      const video = document.getElementById('camera-video');
      video.srcObject = stream;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:58:14