1、首先 是微信上上传照片 要求既能唤起相册 也能唤起相机 类似图如下

因为产品反映 部分机型无法调用 拍照功能
然后对input进行了分析
平常普通使用的input 类似
<input accept="image/*" >但是 对某些不兼容的机型 就需要强制唤起相机 类似如下
<input accept="image/*" capture="camera">由于不兼容的手机 还没找到他们的内核规律, 所以只能单个手机类型进行分辨,代码如下
let u = navigator.userAgent;
let AndroidArr = ['HUAWEIEML-AL00', 'HUAWEIELE-AL00'];
let getIndex = AndroidArr.findIndex((item) => { return u.indexOf(item) > -1;});
let isAndroidLow = getIndex>-1? true : false
根据 参数 isAndroidLow 如果为true 就是不兼容的机型 选择第二种
唤起手机相机兼容问题 大致解决啦
2、第二个问题 接踵过来 关于苹果手机兼容性问题
苹果手机升级换代, 系统升级, 导致以前图片翻转问题 在高版本上 无需人工解决
关于iOS手机竖着拍的照片经过前端处理之后被旋转了90°的原因以及解决方案
可以查看文章 www.jianshu.com/p/ad4501db1…
说的相当的详细
对于这个问题 就是要判断ios版本 当版本高的时候 默认不处理就行
3、微信端一直调用相机 出现页面强制刷新问题
在低版本的ios上 出现了微信内 一直反复调用相机 结果页面被刷新的情况
在测这个问题的时候 发现 antd-mobile 没有出现
于是就去看 antd-mobile 图片上传插件
在网上的大佬的指点下
看到了 一篇 关于 orientation 如何获取的文章
文章地址如下
https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side
经过反复测试 发现引入exif 去获取 orientation 会导致 微信内存过大 页面强制刷新
获取orientation 根据上述文章 可以使用原生方法进行获取
代码如下
export const getOrientation = (file, callback) => {
var reader = new FileReader();
reader.onload = (event) => {
if (! event.target) {
return;
}
const file = event.target;
const view = new DataView(file.result);
if (view.getUint16(0, false) != 0xFFD8) {
return callback(-2);
}
const length = view.byteLength
let offset = 2;
while (offset < length) {
if (view.getUint16(offset+2, false) <= 8)
return callback(-1);
let marker = view.getUint16(offset, false);
offset += 2;
if (marker == 0xFFE1) {
if (view.getUint32(offset += 2, false) != 0x45786966) {
return callback(-1);
}
let little = view.getUint16(offset += 6, false) == 0x4949;
offset += view.getUint32(offset + 4, little);
let tags = view.getUint16(offset, little);
offset += 2;
for (let i = 0; i < tags; i++) {
if (view.getUint16(offset + (i * 12), little) == 0x0112) {
return callback(view.getUint16(offset + (i * 12) + 8, little));
}
}
} else if ((marker & 0xFF00) != 0xFF00) {
break;
}
else {
offset += view.getUint16(offset, false);
}
}
return callback(-1);
};
reader.readAsArrayBuffer(file);
}使用 上述方法 代替 exif 就避免了 微信调用相机多次 页面刷新问题
希望对遇到 手机相机调用兼容性的问题的你 有所帮助啦~