WebView 上传文件
2017-04-04 本文已影响94人
代码在码我
遇到 WebView 点击链接上传文件的需求,一开始以为可以通过 mWebView.getSetting() 再设置一些属性来实现,但发现其默认是没有相关功能方法的。
当我们在页面点击<input type="file">时,WebChromeClient中的openFileChooser()(onShowFileChooser() Android >= 5.0) 就会被触发。这里所调用的方法在不同 Android 版本是不一样的,我们需要复写这些隐藏方法来适配不同机型来保证能正常唤醒系统相册或三方app来选择图片或文件。也就是在这些方法中可以通过 Intent 来打开系统相册或三方应用来选择图片或文件:


那我们如何将选中的图片或文件信息传递给WebView,告诉她我们选择了什么呢?答案是 ValueCallback 接口。

通过实现其onReceiveValue方法就能实现将选中的文件或图片信息传递到WebView中。注意的是,Android > 5.0 中回调的是 ValueCallback<Uri[]>,需要对返回的数据稍作处理,如下

其他低于5.0的处理只需获取Intent的data调用ValueCallback的onReceiveValue即可。最后要把相关的ValueCallback重置为null避免下次点击上传失效。
还有关键一点是,WebChromeClient源码中的openFileChooser是系统API,打包混淆会使这个方法也被混淆,导致无法回调,故我们应不混淆这个方法。
