关于H5在部分安卓手机上调用摄像头拍照后浏览器自动刷新,无法上传图片的解释

这个问题具体表现为在移动端浏览器上或android的webview上打开某个网页 调用摄像头拍照后,无法实现图片上传,浏览器会自动刷新;这一问题无法100%重现,但概率不低:

在如红米等低端安卓机上发生的概率会比较高。

用微信打开的网页出现这种情况的概率更大;

跟调取系统相册相比,调用摄像头拍照出现这种情况的概率更大;

这个问题的原因主要是由于android底层设计缺陷引起的,让我们看看这一行为过程到底发生了些什么:

1.当用户从浏览器调用摄像头时,Android系统会把系统进程从浏览器切换到摄像头(或者相册),这个时候浏览器进程变成了后台进程;

2.由于Android操作系统的设计缺陷,此时浏览器进程的留存优先级(不被系统kill掉的优先级)与所有其它的后台进程是一样的,因此如果操作系统认为内存不足需要进行清理,此时浏览器进程将不会得到任何保护 -- 很不幸,因为浏览器占用内存一般都比较大,所以这次kill操作很容易kill掉浏览器进程;

3.当用户选择好图片返回浏览器时,浏览器进程已经不复存在了,按照Android的机制,浏览器进程将进行恢复,试图恢复到kill之前的状态 -- 很不幸,恢复到什么状态是由浏览器来决定的,而浏览器不可能100%恢复到选择文件之前的那个状态。因此最终用户所看到的现象就是:选择文件完成后,浏览器刷新了一下,而刷新到什么状态由浏览器决定。

对于这一问题,Android技术团队的态度是回避(将bug标记为obsolete) -- 可能是因为此bug涉及了OS底层进程切换的机制,修复起来风险太高;而随着手机设备内存容量的增大,这一问题所发生的概率会越来越小。

理解了问题的原因,对问题的一些表征也就有了合理的解释:低端安卓机的内存更小,因此发生问题的频率更高;而与选择本地图片相比,调取系统摄像头所耗的内存更大(当拍摄有大量文字的图片时尤其如此),因此调取摄像头时问题发生的更加频繁;当用户已经开了很多别的App时,问题发生的概率更大。

感谢chuan chao‘s 分享

你可能感兴趣的:(关于H5在部分安卓手机上调用摄像头拍照后浏览器自动刷新,无法上传图片的解释)