Android WebView onShowFileChooser选择文件后结果不显示问题求助
WebView 文件选择后 HTML Input 不显示选中结果的解决办法
问题核心在于手动构建的文件选择逻辑未匹配WebView的标准要求:一是自定义GetContent Intent缺少WebView需要的参数,二是返回的Content URI未授予WebView访问权限,导致WebView无法读取文件元数据,最终无法在HTML输入框中展示选中状态。
修正方案
使用WebView原生
FileChooserParams生成Intent
放弃手动创建GetContentIntent,改用FileChooserParams.createIntent()生成符合WebView规范的请求,它会自动适配HTML input的文件类型、多选设置等参数。授予WebView URI临时访问权限
在Intent中添加FLAG_GRANT_READ_URI_PERMISSION,确保WebView能读取选中文件的内容。用
FileChooserParams.parseResult解析结果
不要手动构建Uri数组,通过WebView提供的解析方法生成标准结果,避免格式不匹配问题。
修改后的代码示例
重写onShowFileChooser方法
@Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { browserFragment.filePathCallback = filePathCallback; browserFragment.fileChooserParams = fileChooserParams; // 基于WebView的参数生成标准Intent Intent intent = fileChooserParams.createIntent(); // 添加临时读取权限 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); browserFragment.filePicker.launch(intent); return true; }
重新实现文件选择器的注册与回调
// 改用StartActivityForResult处理Intent返回结果 ActivityResultContracts.StartActivityForResult contract = new ActivityResultContracts.StartActivityForResult(); ActivityResultCallback<ActivityResult> callback = result -> { if (browserFragment.filePathCallback == null) return; // 用WebView原生方法解析结果,生成标准Uri数组 Uri[] results = FileChooserParams.parseResult(result.getResultCode(), result.getData()); browserFragment.filePathCallback.onReceiveValue(results); // 回调后清空引用,避免内存泄漏 browserFragment.filePathCallback = null; }; filePicker = registerForActivityResult(contract, callback);
关键说明
FileChooserParams是WebView为文件选择场景提供的标准工具类,能保证Intent参数和结果解析完全适配WebView的逻辑,避免手动实现的偏差。- 授予临时权限后,WebView才能读取Content URI对应的文件信息,进而在HTML输入框中展示文件名等选中状态。
内容的提问来源于stack exchange,提问作者SunnyRuss
相关产品推荐
相关产品推荐

