2021年Kotlin开发Android应用如何实现WebView多文件上传?
问题排查与修复方案
你的代码存在4个核心问题,按优先级修改即可实现高版本Android的多图上传:
- onCreate 加载地址笔误
你在onCreate中调用loadUrl(appLinkUrl, ""),但appLinkUrl仅在深链跳转的handleIntent方法中定义,首次启动加载的变量应该是你之前赋值的pageUrl,修改为:
loadUrl(pageUrl, "")
- onShowFileChooser 未使用选择器包装
高版本的文件选择Intent必须用Intent.createChooser包装,否则部分系统原生选择器不会触发多选能力,同时不要随意覆盖fileChooserParams生成的Intent配置,除非你明确要限制仅上传图片,修改后的方法代码:
override fun onShowFileChooser(webView: WebView?, filePathCallback: ValueCallback<Array<Uri>>?, fileChooserParams: FileChooserParams?): Boolean { uploadMessage?.onReceiveValue(null) uploadMessage = filePathCallback val intent = fileChooserParams!!.createIntent() // 匹配网页的multiple属性自动开启多选,也可以强制写true固定支持多选 if (fileChooserParams.isMultipleSelectionAllowed) { intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) } // 仅在需要强制限制只能上传图片时保留下面两行,否则删除 intent.type = "image/*" intent.addCategory(Intent.CATEGORY_OPENABLE) try { // 必须包装选择器,否则部分系统不支持多选 startActivityForResult(Intent.createChooser(intent, "选择图片"), REQUEST_SELECT_FILE) return true } catch (e: ActivityNotFoundException) { uploadMessage?.onReceiveValue(null) uploadMessage = null Toast.makeText(applicationContext, "无法打开文件选择器", Toast.LENGTH_LONG).show() return false } }
- 低版本onActivityResult取错Intent
低版本分支你取的是当前Activity的intent,不是文件选择返回的data参数,修改对应代码:
} else if (requestCode == FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) return // 把原来的intent换成参数传入的data val result = if (data == null || resultCode != RESULT_OK) null else data.data mUploadMessage?.onReceiveValue(result) mUploadMessage = null }
- 缺少动态存储权限申请
Android 6.0及以上需要动态申请存储权限才能正常读取选中的图片:
- Android 13及以上申请
Manifest.permission.READ_MEDIA_IMAGES - Android 12及以下申请
Manifest.permission.READ_EXTERNAL_STORAGE
权限申请通过后再使用WebView加载页面即可。
注:旧版本Android(5.0以下)本身系统不支持多文件上传,无需额外适配,符合你的兼容要求。如果部分国产定制系统测试仍无法多选,可安装谷歌官方文件管理器Files测试,排除系统自带选择器不支持多选的问题。
内容的提问来源于stack exchange,提问作者Xtophe
相关产品推荐
相关产品推荐

