比如这篇文章: https://juejin.im/entry/5817f71abf22ec00689e4b8a webview 可以使能缓存机制,那图片应该是存在了文件系统的某个位置; 在应用目录下有一些 文件名是经过 hash 的文件,应该是对应的缓存文件, 至于 hash 的算法,根据 https://stackoverflow.com/a/27148985/5105007 这个回答,应该是不开放的; 如果 android 出于安全考虑不开放相关 api,那还有办法把 webview 里的图片读出来?
1
zapper 2018-02-05 17:17:27 +08:00
注入 js 拦截图片吧
|
2
Khlieb 2018-02-05 17:21:47 +08:00 via Android
|
3
hxsf 2018-02-05 17:30:01 +08:00
我记得 webview 可以自己拦截所有请求的吧。正常代理这些请求,把响应中是图片的保存下来。
|
4
shoaly 2018-02-05 17:52:33 +08:00
老老实实拿到连接, 然后重新下载吧.
就算找到了接口, 安卓众多 ROM 的不同 你也做不了兼容和适配. 说不定同一个厂家的 ROM 升级之后你的 hack 方法也失效了. 不值当. |
5
why1 2018-02-05 18:07:00 +08:00 via Android
你断网再另存图片也是可以的
|
6
Rheinmetal 2018-02-05 19:49:05 +08:00 via Android
再下载一遍 不就是用缓存吗 多一个 304 而已 又不 费 流量
|
7
flyingghost 2018-02-05 20:11:09 +08:00
@Rheinmetal 兄台错矣,自己发请求下载要想得到 304,你得知道 Last-Modified/ETag 等信息,这些信息应该在 WebView 下面的缓存管理器里。再说即使得到 304,也还是要跟缓存管理器要 content。HTTPConnection 可不会自动帮你做这些事。(以上都是猜的未经验证)
(可能)可行的办法是: 1,自己做 WebView 的所有网络请求。顺带就可以自定义缓存并提供想要的任何接口了。 2,把 img 画在 canvas 上再导出 base64 再还原成文件(虽然已经不是服务器上原本的那个文件了)。 <script type="text/javascript"> function getBase64Image(img) { var canvas = document.createElement("canvas"); canvas.width = img.width; canvas.height = img.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, img.width, img.height); var dataURL = canvas.toDataURL("image/png"); console.log(dataURL); return dataURL } </script> <img crossOrigin="Anonymous" src="https://upload.ibesteeth.com/tmp/club/img/1513250107372f058df49.jpg" onclick="getBase64Image(this)"/> 但这样的实现有一个安全问题:默认 canvas 是在本地匿名域上的,img 不是,而默认的安全模型是不允许直接导出的。这也是需要 crossOrigin="Anonymous"的原因。如果 WebView 有什么办法处理跨域问题,应该就可以用起来了。 手头没有 Android 环境,lz 自己试试这个思路? |
8
KuroNekoFan 2018-02-06 07:50:20 +08:00 via iPhone
可以转成 base64 再传给 android
|
9
raiz OP |