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 失败的主要内容,如果未能解决你的问题,请参考以下文章

ios&h5混合开发项目仿app页面跳转优化

H5+APP混合开发上传图片

androd H5混合开发 当无网络下,android怎么加载H5界面

Android摄像头相册使用+上传照片至服务器(下篇)

Android与H5混合开发

Android摄像头相册使用+上传照片至服务器(上篇)