![](/img/trans.png)
[英]Can we access native things like contact list, camera pictures, etc of an android device in HTML5 and javascript using phonegap?
[英]HTML5 & javascript - taking pictures from a device supporting multiple cameras
我正在开发一个基于 Vuejs 的 PWA。 我已经实现了一个使用设备内置相机拍照的组件。 它正在使用
navigator.mediaDevices.getUserMedia
API 带有一个video
元素,用于显示来自相机的流。canva
及其getContext("2d").drawImage
方法从流中获取图片并将其显示给用户navigator.mediaDevices.enumerateDevices
API 获取可用摄像机列表和getUserMedia
的约束参数以在这些之间切换。这一切都很好:)
但是现在我偶然发现了一个新问题:最近的一些智能手机有多个后置摄像头,内置相机软件会将这些摄像头组合起来只拍摄一张照片(一个相机适合低曝光,另一个适合高曝光,还有一个在其他一些条件下,等等)。 在这种情况下,我的应用程序将显示所有相机并让用户独立使用它们。 预期的行为是像内置软件一样将它们组合起来。 这怎么可能?
在尝试具有 1 个(正面)、2 个(背面和正面)和多个摄像头传感器(1 个正面,多个背面)的多个设备后,我的解决方案包括使用mediaDevices.enumerateDevices()
返回的MediaDeviceInfo
对象的 label 属性:
然后我的代码获取前置摄像头和组合后置摄像头的 id 如下(它假设总是只有一个前置摄像头):
return navigator.mediaDevices.enumerateDevices()
.then(mediaDevices => {
let cameras = mediaDevices.filter(mediaDevice => mediaDevice.kind === 'videoinput');
console.log("#potential camera=" + cameras.length);
if(cameras.length<=2)
return cameras.map(x => x.deviceId);
else {
let front = cameras.find(x => x.label.match(/\bfront\b/));
let back = cameras.filter(x => x.label.match(/\bback\b/) && x.label.match(/\b0\b/))
if(!front || back.length!=1) {
console.log("no clear front and back, taking first and last one - cameras=", cameras);
return [cameras[0].deviceId, cameras[cameras.length-1].deviceId];
}
else {
console.log("clear front and back");
return [front.deviceId, back[0].deviceId];
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.