WebView 上传文件

遇到 WebView 点击链接上传文件的需求,一开始以为可以通过 mWebView.getSetting() 再设置一些属性来实现,但发现其默认是没有相关功能方法的。

当我们在页面点击<input type="file">时,WebChromeClient中的openFileChooser()(onShowFileChooser() Android >= 5.0) 就会被触发。这里所调用的方法在不同 Android 版本是不一样的,我们需要复写这些隐藏方法来适配不同机型来保证能正常唤醒系统相册或三方app来选择图片或文件。也就是在这些方法中可以通过 Intent 来打开系统相册或三方应用来选择图片或文件:

点击网页链接的回调方法
选择文件

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

ValueCallback

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

> Android 5.0 的调用系统相册或文件的回调处理

其他低于5.0的处理只需获取Intent的data调用ValueCallback的onReceiveValue即可。最后要把相关的ValueCallback重置为null避免下次点击上传失效。

还有关键一点是,WebChromeClient源码中的openFileChooser是系统API,打包混淆会使这个方法也被混淆,导致无法回调,故我们应不混淆这个方法。

添加混淆规则
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,368评论 25 708
  • 要说Android中最厉害的组件莫过于Webview 了,夸张点说把这个组件放在屏幕上就可以算作一个简单地浏览器应...
    saymagic阅读 4,509评论 4 18
  • 由于项目需求,需要在一个h5页面上实现图片上传的功能。实现的过程是,当用户点击 时,webview会监听到这个事件...
    衣忌破阅读 1,229评论 0 0
  • 直接切入主题了 最近公司项目里线上用户反馈出一个bug,介入的第三方平台中有个添加图片的功能,当点击H5中的按钮的...
    影响身边的人阅读 1,553评论 0 11
  • 日子上有了一层光芒,正所谓人逢喜事精神爽,晚上在朋友的陪伴下完成了200个跳投,朋友说那不得2个小时啊,结...
    T伊恩阅读 289评论 0 0