如何解决Android WebView应用访问WooCommerce站点无法上传文件的问题
问题原因排查与解决方案
1. 核心问题说明
Android WebView 默认未实现文件选择相关的回调逻辑,不会响应网页端的<input type="file">上传请求,这就是你在浏览器正常、WebView里无法上传文件的核心原因。同时你的应用缺少文件访问、相机相关的权限声明和动态申请逻辑。
2. 第一步:补充AndroidManifest.xml权限
在manifest的<manifest>标签下添加以下权限,适配不同安卓版本的文件访问需求:
<!-- 相机权限(如果需要拍照上传) --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 安卓13以下存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 安卓13及以上媒体权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
3. 第二步:修改MainActivity实现文件上传逻辑
3.1 添加全局变量
在MainActivity类中添加以下变量:
private ValueCallback<Uri[]> mUploadCallback; private final int FILE_CHOOSER_REQUEST_CODE = 1001;
3.2 配置WebChromeClient
在WebView初始化的位置(你原来设置WebViewClient的代码附近)添加WebChromeClient的配置:
// 原有WebView配置保留,新增以下代码 webview.setWebChromeClient(new WebChromeClient() { // 安卓5.0+的文件上传回调 @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { // 如果已经有未处理的上传回调,先取消 if (mUploadCallback != null) { mUploadCallback.onReceiveValue(null); } mUploadCallback = filePathCallback; // 打开文件选择器 Intent intent = fileChooserParams.createIntent(); try { startActivityForResult(intent, FILE_CHOOSER_REQUEST_CODE); } catch (ActivityNotFoundException e) { mUploadCallback = null; return false; } return true; } // 兼容安卓4.4及以下版本的文件上传回调 public void openFileChooser(ValueCallback<Uri> uploadMsg) { openFileChooser(uploadMsg, ""); } public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { openFileChooser(uploadMsg, acceptType, ""); } public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { if (mUploadCallback != null) { mUploadCallback.onReceiveValue(null); } } });
3.3 处理文件选择结果
重写MainActivity的onActivityResult方法,接收用户选择的文件并返回给WebView:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == FILE_CHOOSER_REQUEST_CODE) { if (mUploadCallback == null) { return; } // 获取选择的文件Uri Uri[] result = null; if (resultCode == RESULT_OK && data != null) { String dataString = data.getDataString(); ClipData clipData = data.getClipData(); if (clipData != null) { result = new Uri[clipData.getItemCount()]; for (int i = 0; i < clipData.getItemCount(); i++) { result[i] = clipData.getItemAt(i).getUri(); } } else if (dataString != null) { result = new Uri[]{Uri.parse(dataString)}; } } // 返回结果给WebView mUploadCallback.onReceiveValue(result); mUploadCallback = null; } }
4. 第三步:补充运行时权限申请
上述添加的存储、相机权限属于Android危险权限,需要在应用运行时主动向用户申请授权,你可以在MainActivity的onCreate方法里初始化WebView之前,调用权限申请逻辑,判断如果用户没有授权就先申请权限。
内容的提问来源于stack exchange,提问作者Jack Vale
相关产品推荐
相关产品推荐

