Android-混合开发奇案-上传照片至 H5 失败
Posted Q-CODER
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-混合开发奇案-上传照片至 H5 失败相关的知识,希望对你有一定的参考价值。
混合开发小白的探坑之路--这次话不多说,直接进入主题。
在开发阶段,涉及的手机都没有出现上面的问题-在 H5 调起原生相机相册,选择文件后,H5 页面无法获取到对应文件展示。
结果一到测试阶段--红米note9(android10) ,荣耀 30(Android10),OPPO R17(Android10),OPPO Reno5 (Android11),小米10(Android10),均出现了该问题。但均不是必现。而且,通过云测以上机型也均没有出现问题。你说是不是奇案?
在没有思路的情况下,我决定写一个 Demo,将因素一个个进行研究。
最直接的发现是
只与是否经历过压缩操作(当时,我都打算研究压缩的源码了)。后来,从结果出发研究了一下,发现在最后发给H5的路径有点不同
从上面的日志,我们可以发现:
第一:压缩后的是file://协议
第二:最后的文件名也是不一样的(看着应该是时间戳)看了一下源码
String cacheBuilder = mTargetDir + "/" +
System.currentTimeMillis() +
(int) (Math.random() * 1000) +
(TextUtils.isEmpty(suffix) ? ".jpg" : suffix);
哦?既然最后传过去的是这样,那假设我不经过压缩,我直接将结果组织成这样返回,按理说应该也是可以成功的。
于是我
mFilePathCallback?.onReceiveValue(arrayOf(Uri.parse("file://"+PhotoUtils.PATH_PHOTO)))
并且其中 PATH_PHOTO
PATH_PHOTO = getSdCardDirectory(context) + "/"+System.currentTimeMillis()+".png"
果不其然,成功了。解决了上面的问题
实验得出,可正常使用的方案就是:
1.传给H5的路径,要符合 file:// (file 协议)。
2.拍照后的照片存储的名字要唯一。
问题解决了?可以说解决了,但是没有完全解决。
如果只是想满足【能用】就行,那的确是解决了。接下来,放出几个我测试过程中发现的问题,暂时没有研究出为什么?后续有结论后会补充说明。大家也可以帮我看看是为什么?谢过。
情况1:
在拍照的时候,拍照临时存的文件,如果是设定为同一个名字。即 PATH_PHOTO 设置为
PATH_PHOTO = getSdCardDirectory(context) + "/temp.png"
,会出现第二张拍照的文件无法上传
操作如下:
日志如下:
情况2:
正当,我以为是同一个文件名,可能系统缓存中认为是同一张照片,所以没办法上传的时候。我发现了如果在两次拍照的中间,加一次上传相册的图片,TMD又可以了?我自闭了。
操作如下:操作gif太大,无法上传。假设你们可以看懂。实在想象不到的话
链接:https://pan.baidu.com/s/1nTZDXqPusq4wWBPdl1nrqw
提取码:lqna
复制这段内容后打开百度网盘手机App,操作更方便哦
日志如下:
情况3:
测试是否与websetting (appCache,domStorage)有关
WebView类型 | enable AppCache | enable domStorage | enable both |
X5(Tencent) | X | X | √ |
原生 | X | X | X |
测试结果:在 X5WebView 中,将 appCache,domStorage 都使能的情况下。App 在第二次进入时,相机&相册功能均正常。
情况4:
测试是否与 file协议 有关
WebView类型 | 遵循file协议 |
X5(Tencent) | √ |
原生 | √ |
测试结果:无论是 X5 还是原生 在遵循file协议下,相机&相册均可成功。
以上是关于Android-混合开发奇案-上传照片至 H5 失败的主要内容,如果未能解决你的问题,请参考以下文章