h5调用原生实现相机
调用原生相机的方法
在H5页面中调用原生相机功能,通常需要通过JavaScript与原生应用(如iOS/Android)的WebView进行交互。以下是常见的实现方式:
使用<input type="file">触发相机
<input type="file" accept="image/*" capture="camera">
accept="image/*"限制文件类型为图片capture="camera"指定直接调用摄像头而非相册(部分浏览器支持)
通过WebView桥接调用原生API
// 判断环境后调用原生方法
if (isIOS) {
window.webkit.messageHandlers.openCamera.postMessage({});
} else if (isAndroid) {
AndroidInterface.openCamera();
}
需原生端实现对应接口:
- iOS:通过
WKUserContentController注册handler - Android:通过
@JavascriptInterface注解暴露方法
兼容性处理方案
特征检测判断是否支持直接调用
const isCameraSupported = () => {
return 'mediaDevices' in navigator &&
!!navigator.mediaDevices.getUserMedia;
};
备用方案(相册上传)
<input type="file" accept="image/*" id="fallbackUpload">
权限请求最佳实践
动态请求摄像头权限
navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => {
// 成功获取视频流
})
.catch(err => {
console.error('摄像头访问被拒绝:', err);
});
移动端特殊配置要求
- iOS 11+:需要https环境或localhost
- Android:需在Manifest声明
CAMERA权限
图片处理与回传
接收拍摄的图片
document.getElementById('cameraInput').addEventListener('change', (e) => {
const file = e.target.files[0];
const imgUrl = URL.createObjectURL(file);
// 显示预览图
document.getElementById('preview').src = imgUrl;
});
压缩图片上传
function compressImage(file) {
return new Promise((resolve) => {
const reader = new FileReader();
reader.onload = (e) => {
const img = new Image();
img.src = e.target.result;
img.onload = () => {
const canvas = document.createElement('canvas');
// 按比例缩小尺寸
const MAX_WIDTH = 800;
const scale = MAX_WIDTH / img.width;
canvas.width = MAX_WIDTH;
canvas.height = img.height * scale;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
canvas.toBlob(resolve, 'image/jpeg', 0.7);
};
};
reader.readAsDataURL(file);
});
}
注意事项
- 部分安卓机型会忽略
capture属性,需通过WebView桥接实现 - iOS 15+ Safari会默认使用拍照模式,但可能返回HEIC格式
- 华为等定制浏览器可能需要特殊UA检测
- 图片上传建议添加EXIF方向校正处理

