Android 6特定设备WebView从图库选文件上传失败求助
晚上好!我之前做WebView文件上传功能时,也碰到过某款定制Android 6设备出异常的情况,给你几个实用的排查和解决方向:
检查权限动态申请是否完整
Android 6开始要求动态申请存储权限,虽然其他6.0设备正常,但部分定制ROM的权限校验会更严格。务必在触发文件选择前,确认已申请READ_EXTERNAL_STORAGE(Android 6下可顺带申请WRITE_EXTERNAL_STORAGE)且用户已授权。可以加一段权限检查逻辑:if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_STORAGE); }确认WebView的文件上传配置是否正确
确保WebView开启了文件上传相关的核心设置:webView.getSettings().setAllowFileAccess(true); webView.getSettings().setAllowContentAccess(true); webView.getSettings().setDomStorageEnabled(true);另外,Android 5+的WebView必须重写
WebChromeClient的onShowFileChooser方法,正确处理文件选择回调——部分定制ROM对这个方法的实现要求更苛刻,比如必须返回true,且要完整处理FileChooserParams的acceptTypes、capture等参数。排查设备定制ROM的特殊限制
不少国内厂商的Android 6定制ROM会给WebView的文件访问加额外限制,比如默认禁止WebView访问图库目录。你可以先在该设备上用系统自带浏览器打开同一页面测试:- 如果系统浏览器也无法上传,那基本是设备ROM的限制,可能需要引导用户去系统设置开启相关权限,或者联系厂商反馈;
- 如果系统浏览器可以正常上传,那就是你的App里WebView的配置或权限逻辑有问题,再回头细化排查。
手动处理文件选择Intent
有时候WebView默认调用的文件选择Intent在定制ROM里无法正常唤起图库,或者返回的Uri格式异常。你可以在onShowFileChooser里手动构造Intent唤起图库:Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);之后在
onActivityResult里把选中的Uri转换成WebView需要的格式,通过ValueCallback返回给WebView即可。检查WebView版本
部分Android 6设备的系统WebView版本过旧,存在已知的文件上传Bug。可以引导用户去Google Play更新Android System WebView,或者在你的App里集成最新版的Chrome WebView组件,确保使用较新的WebView内核。
希望这些方法能帮你解决问题!
内容的提问来源于stack exchange,提问作者Алексей Завьялов

