

新闻资讯
技术学院本文详解如何使用 html5 的 `mediadevices` api 在浏览器中安全、兼容地访问移动设备摄像头,列举可用摄像头设备,并提供可直接运行的代码示例与关键注意事项。
在现代 Web 应用中,无需依赖原生 App 即可调用移动设备摄像头——这得益于 HTML5 提供的标准化媒体设备访问能力。核心接口是 navigator.mediaDevices,它属于 MediaDevices API,支持在桌面和移动端(Chrome、Safari(iOS 14.3+)、Firefox、Edge)中获取摄像头、麦克风等硬件列表,并启动实时视频流。
async function listCameras() {
try {
// 必须在用户交互(如点击)后调用,否则部分浏览器会拒绝权限
const devices = await navigator.mediaDevices.enumerateDevices();
const videoInputs = devices.filter(device => device.kind === 'videoinput');
console.log('可用摄像头:', videoInputs);
// 示例输出:
// [
// { label: "Front Camera", kind: "videoinput", deviceId: "abc123...", groupId: "..." },
// { label: "Back Camera", kind: "videoinput", deviceId: "def456...", groupId: "..." }
// ]
return videoInputs;
} catch (err) {
console.error('获取设备列表失败:', err.name, err.message);
}
}⚠️ 注意:enumerateDevices() 不触发权限请求,仅列出已授权或系统预置的设备。若从未授过相机权限,返回的 label 可能为空(如 "videoinput"),需结合 getUserMedia() 触发实际授权。
对于移动 Web 应用,最可靠的方式是跳过手动选择,直接请求「后置摄像头」或「前置摄像头」:
const video = document.getElementById('preview');
document.getElementById('openBack').addEventListener('click', async () => {
try {
const stream = await navigator.mediaDevices.getUserMedia({
video: { facingMode: 'environment' }, // 强制后置
audio: false
});
video.srcObject = stream;
} catch (err) {
alert('无法打开后置摄像头:' + err.message);
}
});
document.getElementById('openFront').addEventListener('click', async () => {
try {
const stream = await navigator.mediaDevices.getUserMedia({
video: { facingMode: 'user' }, // 强制前置
audio: false
});
video.srcObject = stream;
} catch (err) {
alert('无法打开前置摄像头:' + err.message);
}
});✅ facingMode: 'environment' 是 iOS 和 Android 主流浏览器(Chrome/Safari/Edge)广泛支持的标准方式,比依赖 deviceId 更健壮。
你无需“跳转到原生 App”即可实现拍照功能——现代浏览器已原生支持摄像头调用。优先使用 facingMode 控制前后置,辅以 enumerate
Devices() 做设备探测与降级提示。搭配合理的权限引导与错误反馈,即可构建体验接近原生的 Web 拍照流程。