You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:54:04