从 Android 中的网络视图访问外部 USB 摄像头
Access an external USB camera from the webview in Android
我的 Android 应用程序中有一个网络视图。从网络视图中,我可以访问 phone 上的默认摄像头。以下代码工作正常。
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 摄像头。以上权限在 web 视图中打开默认摄像头。
我没能找到任何文档说这件事是可能的。是因为一些安全问题吗?
您可能遇到 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 摄像头也应该足够了。
请注意,如您所知,文档中有关于 not blinding granting Webkit permission 的警告。当您转向生产时,请记住替换
request.grant(request.getResources())
也许还有更像这样的东西
if (isRequestOriginOrWhateverApproved(request)) {
request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE});
}
我的 Android 应用程序中有一个网络视图。从网络视图中,我可以访问 phone 上的默认摄像头。以下代码工作正常。
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 摄像头。以上权限在 web 视图中打开默认摄像头。
我没能找到任何文档说这件事是可能的。是因为一些安全问题吗?
您可能遇到 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 摄像头也应该足够了。
请注意,如您所知,文档中有关于 not blinding granting Webkit permission 的警告。当您转向生产时,请记住替换
request.grant(request.getResources())
也许还有更像这样的东西
if (isRequestOriginOrWhateverApproved(request)) {
request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE});
}