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

USB相机驱动程序和相机选择可能存在问题,而不是权限问题.

> USB相机驱动程序

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

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

>相机选择

您提到您的测试始终使用默认摄像头,因此听起来您可能没有主动枚举并选择目标摄像头.可以使用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摄像头.

request.grant(request.getResources())

也许有更像这样的东西

if (isRequestOriginOrWhateverApproved(request)) {

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

}