从Android中的webview访问外部USB摄像头

Vik*_*kas 5 android webview usb-camera

我的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());
    }
});
Run Code Online (Sandbox Code Playgroud)

我的问题是从这个webview访问外部USB摄像头.以上权限将打开webview中的默认摄像头.

我一直无法找到任何文件,甚至说这件事是可能的.是因为一些安全问题吗?

use*_*881 2

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

  1. USB 摄像头驱动程序

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

USB 摄像头库https://github.com/saki4510t/UVCCamera经常用于为 USB 摄像头提供更广泛的支持,但从我对该库的有限经验来看,它会写入 TextureView,因此可能无法在 WebRTC 中很好地发挥作用。网页视图。在一项非常粗略的调查中,我没有看到支持连接外部视频源的 WebView 挂钩。

  1. 相机选择

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

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));
Run Code Online (Sandbox Code Playgroud)

由于您的权限对于内置摄像头来说足够了,据我所知,它们对于 USB 摄像头也应该足够了。

请注意,您可能知道,该文档有一个关于不要盲目授予 Webkit 权限的警告。当您进行生产时,请记住更换

request.grant(request.getResources())
Run Code Online (Sandbox Code Playgroud)

也许有更多类似的东西

if (isRequestOriginOrWhateverApproved(request)) {
    request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE});
}
Run Code Online (Sandbox Code Playgroud)