Android Studio集成WebView后文件上传按钮无法使用问题求助
WebView图片上传功能失效解决方案
问题根因
- 自定义的
mywebClient类未实际生效:初始化时调用mywebView.setWebViewClient(new WebViewClient())传入的是默认WebViewClient,没有使用你自己实现的子类 - 缺少文件选择逻辑适配:WebView默认不处理H5页面
<input type="file">标签的点击请求,需要重写WebChromeClient的对应回调方法手动实现图片选择逻辑 - 缺少必要权限声明:当前Manifest仅声明了网络权限,未声明读取本地媒体/存储的权限
- 缺少文件选择结果回传逻辑:选择完图片后没有将结果回传给WebView,导致页面无法拿到选中的图片文件
修复步骤
1. 修改AndroidManifest.xml,补充权限声明
在已有INTERNET权限下方添加以下权限:
<!-- 安卓12及以下读取存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 安卓13及以上读取图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
2. 修改MainActivity.java,补充完整逻辑
完整修改后的代码如下:
package com.example.krilidz; import androidx.appcompat.app.AppCompatActivity; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.content.Intent; public class MainActivity extends AppCompatActivity { private WebView mywebView; private ValueCallback<Uri[]> mUploadMessage; // 注册文件选择结果回调 private final ActivityResultLauncher<Intent> filePickerLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == RESULT_OK && mUploadMessage != null) { Intent data = result.getData(); Uri[] resultUris = null; if (data != null) { if (data.getClipData() != null) { int count = data.getClipData().getItemCount(); resultUris = new Uri[count]; for (int i = 0; i < count; i++) { resultUris[i] = data.getClipData().getItemAt(i).getUri(); } } else if (data.getData() != null) { resultUris = new Uri[]{data.getData()}; } } mUploadMessage.onReceiveValue(resultUris); mUploadMessage = null; } else { if (mUploadMessage != null) { mUploadMessage.onReceiveValue(null); mUploadMessage = null; } } } } ); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mywebView=(WebView) findViewById(R.id.webview); // 修复:使用自定义的WebViewClient mywebView.setWebViewClient(new mywebClient()); // 添加WebChromeClient处理文件选择 mywebView.setWebChromeClient(new WebChromeClient() { @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { mUploadMessage = filePathCallback; // 打开系统文件选择器 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); filePickerLauncher.launch(Intent.createChooser(intent, "选择图片")); return true; } }); mywebView.loadUrl("https://www.krilidz.com/ar/"); WebSettings webSettings=mywebView.getSettings(); webSettings.setJavaScriptEnabled(true); // 开启文件访问权限 webSettings.setAllowFileAccess(true); } public class mywebClient extends WebViewClient{ @Override public void onPageStarted(WebView view, String url, Bitmap favicon){ super.onPageStarted(view,url,favicon); } @Override public boolean shouldOverrideUrlLoading(WebView view,String url){ view.loadUrl(url); return true; } } @Override public void onBackPressed(){ if(mywebView.canGoBack()) { mywebView.goBack(); } else{ super.onBackPressed(); } } }
3. 额外适配说明
如果你的APP目标SDK版本在23及以上,首次启动时需要动态申请存储/读取图片权限,用户授权后才能正常使用图片上传功能。
内容的提问来源于stack exchange,提问作者YahyaST18
相关产品推荐
相关产品推荐

