webView.setWebChromeClient(new WebChromeClient() {
public boolean onShowFileChooser(WebView v, ValueCallback<Uri[]> cb, FileChooserParams p) {
filePathCallback = cb; startActivityForResult(p.createIntent(), REQ_FILE); return true;
}
});
WebView 里点“上传身份证”按钮,文件选择器不弹,页面毫无反应,logcat 里 onShowFileChooser 返回 false,系统浏览器同一页面正常。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:WebView 不会自动处理 input type=file,需要宿主实现 onShowFileChooser 并回调结果,默认返回 false 就什么都不发生。
这次卡住的地方就在「WebView 文件上传」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
处理上按这个顺序:重写 WebChromeClient 的 onShowFileChooser;启动系统文件选择 Intent 并保存回调;在 onActivityResult 里把 Uri 回传给 filePathCallback;拍照和从相册选两种方式都测。
确认没问题再收工,点击上传能弹出文件选择器,选完图片后页面预览并成功提交。
