在Android中通过Web视图访问外部USB摄像头

时间:2018-08-30 08:56:26

标签: android webview usb-camera

我的Android应用中有一个webview。从Web视图中,我可以访问手机上的默认摄像头。以下代码可以正常工作。

<div class="spaceship-1">
  <img src="http://i63.tinypic.com/24nguhx.png" alt="">
</div>
<div class="spaceship-2">
  <img src="http://i63.tinypic.com/24nguhx.png" alt="">
</div>

我的问题是要从此Web视图访问外部USB摄像机。获得以上权限后,将在Web视图中打开默认摄像机。

我找不到任何文档,甚至说这是可能的。是因为某些安全问题吗?

1 个答案:

答案 0 :(得分: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});
}