【问题标题】:Access an external USB camera from the webview in Android从 Android 中的 web 视图访问外部 USB 摄像头
【发布时间】:2018-08-30 08:56:25
【问题描述】:

我的 Android 应用中有一个 webview。从 webview,我可以访问手机上的默认摄像头。以下代码运行良好。

webview.setWebChromeClient(new WebChromeClient(){
    // Need to accept permissions to use the camera
    @Override
    public void onPermissionRequest(final PermissionRequest request) {
        L.d("onPermissionRequest");
        request.grant(request.getResources());
    }
});

我的问题是从此网络视图访问外部 USB 摄像头。以上权限会在 webview 中打开默认摄像头。

我还没有找到任何文档甚至说这件事是可能的。是不是因为一些安全问题?

【问题讨论】:

  • 投票结束了这个(但不是我的反对票),因为它太宽泛了,可能与WebView 没有实际关系。查看文档:developer.android.com/reference/android/hardware/usb/…
  • 我只是在问它是否可能。
  • @Vikas 看到我的回答,你的疑惑就清楚了。
  • 尝试从常规视图/活动中访问相机,如果可能,为所述活动创建一个意图,您可以从网络视图中调用该意图。
  • 以上推荐听起来对我来说是你正在寻找的东西。我认为您的问题需要本地解决(在 android 中)并通过某种意图提供。像 React-Native 这样的框架通过直接解释 JavaScript 可以 100% 进入本机系统。也许您可以查看代码库并找到一些方法来“复制”本机和 webview 之间的通信层。

标签: android webview usb-camera


【解决方案1】:

您可能对 USB 摄像头驱动程序和摄像头选择有问题,而不是权限问题。

  1. USB 摄像头驱动程序

第一步是确保您的 USB 摄像头正在被检测到并且正在您的设备上工作。你没有说明你是否确认了这一点。我的理解是 android.hardware.camera2 对 USB 摄像头的支持仍然很差。如果您的相机受支持,那么希望它会与其他相机一起枚举。在我使用 Android 8.1.0 进行的测试中,我连接的 USB 摄像头没有被 CameraManager 枚举,而它在下面的库中。

USB 相机库https://github.com/saki4510t/UVCCamera 经常用于为 USB 相机提供更广泛的支持,但根据我对写入 TextureView 的库的有限经验,因此可能无法在 WebView 中很好地使用 WebRTC。在一项非常粗略的调查中,我没有看到支持连接外部视频源的 WebView 挂钩。

  1. 相机选择

您提到您的测试始终使用默认摄像头,因此听起来您可能没有主动枚举和选择目标摄像头。可以使用navigator.mediaDevices 接口在 Javascript 中执行 WebRTC 摄像头选择。例如,

function chooseDevice(videoInDevices) {
    // return selected device
}

// Filter devices so we only consider video sources
function filterForVideoInputs(devices) {
    return devices.filter(d => d.kind === 'videoinput');
}

// Simply pull out deviceId from selected device struct
function getDeviceId(deviceInfo) {
    return deviceInfo.deviceId;
}

// Request video stream from selected deviceId
function requestDevice(deviceId) {
    return navigator.mediaDevices.getUserMedia({
        video: {
            deviceId: {
                exact: deviceId
            }
        }
    });
}

// Connect stream from getUserMedia to HTML5 video element
function startStream(stream) {
    let video = document.querySelector('video');
    video.srcObject = stream;
    video.onloadedmetadata = function () {
        video.play();
    }
}

navigator.mediaDevices.enumerateDevices()
    .then(filterForVideoInputs)
    .then(chooseDevice)
    .then(getDeviceId)
    .then(requestDevice)
    .then(startStream)
    .catch(err => console.log(err));

由于您的权限足以使用内置摄像头,因此据我所知,它们应该也足以用于 USB 摄像头。

请注意,您可能知道,文档中有关于 not blinding granting Webkit permission 的警告。当您转向生产时,请记住更换

request.grant(request.getResources())

也许还有更多类似的东西

if (isRequestOriginOrWhateverApproved(request)) {
    request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE});
}

【讨论】:

  • 这不是完整的故事!在某些设备上,Android 9+ 中的 Webview + USB(外部摄像头 API)实际上存在问题。这就是我所推断的,因为这是一个相当新的问题,而且是一个不常见的问题,而且解决起来非常复杂,我还没有遇到任何解决方案。我正在审查铬源。在我们的设备上,我们有一个CSI 摄像头和一个用于其他设备的 USB 集线器。适用于 CSI 相机(内部)的相同 Webview 代码不适用于 USB 相机(外部)。我们认为这是 linux 或系统端的访问权限问题。
  • 这里是检查如何在 Android 9+ 中实现 USB 摄像头(外部)的链接 groups.google.com/g/android-platform/c/Qx1P0I17uzs 在讨论的底部,我解释了我拥有的所有信息
  • 这还有可能吗?可以连接带有 UVC 协议的 USB 摄像头并在 WebView 中与 WebRTC 一起使用吗?我不想碰内核配置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多