腾讯x5 WebView选择文件的正确姿势


将项目中的webview换成x5以后突然今天有个上传图片的功能要实现,但是原本好好的上传逻辑报错了,有点慌,但是也不慌,一想就是x5搞的鬼。然后就开始跟源码,找方案,,,最后顺利解决。看了网上没有相关例子,记录一下,免得后生们踩坑


报错信息如下图

Caused by: java.lang.IllegalStateException: showFileChooser result was already called

分析以下代码可能是由于onReceiveValue调用了多次导致的

public interface ValueCallback<T> extends android.webkit.ValueCallback<T> {void onReceiveValue(T var1);
}

原生webview的常规写法要适配不同版本,如下

  mWebView.setWebChromeClient(new WebChromeClient() {//以下是在各个Android版本中 WebView调用文件选择器的方法// For Android < 3.0public void openFileChooser(ValueCallback<Uri> valueCallback) {openImageChooserActivity(valueCallback);}// For Android  >= 3.0public void openFileChooser(ValueCallback valueCallback, String acceptType) {openImageChooserActivity(valueCallback);}//For Android  >= 4.1@Overridepublic void openFileChooser(ValueCallback<Uri> valueCallback,String acceptType, String capture) {openImageChooserActivity(valueCallback);}// For Android >= 5.0@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic boolean onShowFileChooser(WebView webView,ValueCallback<Uri[]> filePathCallback,FileChooserParams fileChooserParams) {mValueCallback2 = filePathCallback;Intent intent = fileChooserParams.createIntent();startActivityForResult(intent, CHOOSE_ANDROID_5);return true;}});

但是x5内部是做了适配的,只要实现一个方法即可

public void openFileChooser(ValueCallback<Uri> valueCallback,String acceptType, String capture){}

注意:这里千万不要调用super


完整的x5选择文件如下

    private final int CHOOSE_REQUEST_CODE = 1000;private ValueCallback<Uri> mValueCallback;private void webViewSettings() {mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic void openFileChooser(ValueCallback<Uri> valueCallback,String acceptType, String capture) {openImageChooserActivity(valueCallback);}});}private void openImageChooserActivity(ValueCallback<Uri> valueCallback) {mValueCallback = valueCallback;Intent intent = new Intent();if (Build.VERSION.SDK_INT < 19) {intent.setAction(Intent.ACTION_GET_CONTENT);} else {intent.setAction(Intent.ACTION_PICK);intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);}intent.setType("image/*");((MyPinkFamilyActivity) mContext).startActivityForResult(Intent.createChooser(intent,"选择图片",CHOOSE_REQUEST_CODE);}public void onActivityResult(int requestCode, int resultCode, Intent intent) {switch (requestCode) {case CHOOSE://以下选择图片后的回调processResult(resultCode, intent);break;}}private void processResult(int resultCode, Intent intent) {if (mValueCallback == null) {return;}if (resultCode == Activity.RESULT_OK && intent != null) {Uri result = intent.getData();mValueCallback.onReceiveValue(result);} else {mValueCallback.onReceiveValue(null);}mValueCallback = null;}

总结


遇事不慌,从源码出手!希望对你有所帮助。。。少走弯路,多点时间陪陪家人

腾讯x5 WebView选择文件的正确姿势相关推荐

  1. Android 使用腾讯X5 Webview浏览器拍照或从相册上传图片

    最近在项目开发中,需要使用WebView上传文件.默认情况下情况下,使用Android的WebView是不能够支持上传文件的. 经过查找资料,得知需要重新WebChromeClient,根据选择到的文 ...

  2. 删除文件的正确姿势-Linux权限探索

    删除文件的正确姿势 在Linux系统中,要删除一个文件,到底需要用户拥有怎样的权限呢?这里做一个小小的探究. 首先用普通用户登录,在文件夹my下创建出mydir文件夹并进入,然后创建一个文件file ...

  3. Linux中查看日志文件的正确姿势,求你别tail走天下了!

    作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了.尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是 cat,tail,vi(或 ...

  4. 下载iCloud照片/文件的正确姿势(亲测好使)

    这几天准备停用iCloud,需要把里面的数据取出来进行自行保存.原本以为很简单,但实际准备操作时,却踩了几个大坑. 本人iCloud主要是存照片,共有30多GB,现在网速快,原本以为几个小时就可以下载 ...

  5. Blender图解教程:刷权重时选择骨骼的正确姿势

    Blender2.81Alpha 如果只选择角色然后进入权重绘制模式,那么要选择骨骼的话只能在顶点组中选择,骨骼很复杂的时候,这样做非常低效. 正确的姿势应该是: 在物体模式下先选择骨骼再选择要刷权重 ...

  6. Android Studio引入.so文件的正确姿势 以及调用.so 文件时报错has text relocations 解决

    首先在src同级目录下创建libs目录讲需要的.so复制到这里效果如图 然后在app级别的build.gradle配置lib路径,效果如果 完整代码如下: apply plugin: 'com.and ...

  7. numpy.loadtxt() 处理csv文件的正确姿势

    loadtxt()函数概述 函数loadtxt用于从文本加载数据,我们可以利用该方法把数据读取到np.array中然后做进一步的数据处理,详细信息如下 def loadtxt(fname, dtype ...

  8. Android 获取内部存储中音乐文件的正确姿势

    最近想写一个音乐的小APP出来(doge),借此熟悉音频开发的相关技术.但是在获取内部存储的音乐文件时踩了一些坑...所以有了这篇帖子,简单介绍下Android的存储类别,以及如何获取内部存储中的音乐 ...

  9. 百度网盘非会员转存文件的正确姿势

    ** 按此教程操作,百分之千解决提示文件数量超限问题,看仔细,跟着步骤来 1.首先手机下载百度网盘App,已有百度网盘检查是否为最新版 2.复制收到的网盘链接 3.然后打开百度网盘App,按照图片步骤 ...

  10. android安卓接入腾讯X5浏览器内核TBS基本使用,配置腾讯TBS

    更多其他页面-自定义View-实用功能合集:点击查看 使用腾讯Tbs,会导致上架google应用商城失败! 关于X5内核的一些bug解决,可以查看这些文章: 链接: 解决bug. 安卓原生webvie ...

最新文章

  1. python类直接调用不实例化_未实例化类的python调用方法
  2. 软件开发环境包含的内容
  3. SAP EWM - 存储类型 - 入库控制
  4. Python-OpenCV 处理图像(七):图像灰度化处理
  5. H.264 Quantization
  6. 纯css3天气动画场景特效
  7. 【译】Tim Rose 的kibana插件教程-自定义App插件
  8. eclipse 安装svn插件(Subclipse)
  9. 汉语语音情绪识别,Emotion Recognition by Speech Signal in Mandarin,音标,读音,翻译,英文例句,英语词典...
  10. dfs序七个经典问题[转]
  11. css中引入自定义字体PingFang-SC-Regular
  12. 20阶乘matlab,matlab如何调用阶乘函数求阶乘的和
  13. matlab 峰值位置,在数据中查找峰值 - MATLAB Simulink - MathWorks 中国
  14. python中if in是什么意思_python中的in是什么意思
  15. java rd th 小票机_英语日期rd、th有什么区别,怎么运用?
  16. Roson的Qt之旅#71 Qt绘制星空和旋转的星球
  17. 介绍一个超级的计算器--J语言(1)
  18. jvisualvm 连接 docker 监控springboot jvm
  19. php 查询功能,php实现查询功能的方法
  20. 端到端与点到点到底是什么?

热门文章

  1. wps文件一点打印就关闭打印机服务器,WPS一打印就程序无响应怎么处理?
  2. 华为metebook电脑如何修改应用商店中新应用的默认安装路径
  3. 树莓派Raspberry pi 4B 运行 WuKong-Robot 智能语音对话机器人
  4. 汉字编码原则及0XA1与0X80代表的含义。(汉字编码原则为转发)
  5. 三菱plc编程有c语言吗,三菱plc编程用什么语言
  6. 项目管理-项目整体计划Excel表格绘制
  7. 机器学习视频课程(超清完整11周)分享给大家!
  8. postgres整库导入导出
  9. linux制作win7启动u盘
  10. 微信小程序开源demo汇总