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

Xamarin Android WebView多文件上传问题:现有代码仅支持单文件上传

Xamarin Android WebView 多文件上传解决方案

问题分析

你的现有代码仅通过data.Data获取单个文件Uri,无法处理多文件选择场景。Android中多文件选择的结果会通过ClipData返回,需要针对性调整逻辑。

解决方案

1. 修改OnActivityResult方法

替换原有的FILECHOOSER_RESULTCODE处理逻辑,添加ClipData的判断与遍历:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    if (requestCode == FILECHOOSER_RESULTCODE)
    {
        if (null == mUploadMessage) return;

        List<Android.Net.Uri> uriList = new List<Android.Net.Uri>();
        if (data != null && resultCode == Result.Ok)
        {
            // 处理多文件选择(ClipData)
            if (data.ClipData != null)
            {
                int count = data.ClipData.ItemCount;
                for (int i = 0; i < count; i++)
                {
                    Android.Net.Uri uri = data.ClipData.GetItemAt(i).Uri;
                    uriList.Add(uri);
                }
            }
            // 兼容单个文件选择场景
            else if (data.Data != null)
            {
                uriList.Add(data.Data);
            }
        }

        try
        {
            Android.Content.Context context = Application.Context;
            string text = uriList.Count.ToString();
            ToastLength duration = ToastLength.Long;

            var toast = Toast.MakeText(context, text, duration);
            toast.Show();

            mUploadMessage.OnReceiveValue(uriList.ToArray());
        }
        catch (Exception e)
        {
            // 可添加异常日志记录逻辑
        }

        mUploadMessage = null;
    }

    // 相机上传逻辑保持不变
    if (requestCode == CameraCHOOSER_RESULTCODE)
    {
        if (null == this.mUploadMessage || (resultCode != Result.Ok && !new File(filePath).Exists()))
        {
            this.mUploadMessage.OnReceiveValue(null);
        }
        else
        {
            Android.Net.Uri mCapturedImageURI = Android.Net.Uri.FromFile(new File(filePath.ToString()));
            Android.Net.Uri[] results = new Android.Net.Uri[] { mCapturedImageURI };
            mUploadMessage.OnReceiveValue(results);
        }
        this.mUploadMessage = null;
    }

    base.OnActivityResult(requestCode, resultCode, data);
}

2. 配置WebChromeClient支持多选

在你设置WebChromeClient的OnShowFileChooser方法中,给Intent添加允许多选的参数:

public override bool OnShowFileChooser(WebView webView, IValueCallback filePathCallback, FileChooserParams fileChooserParams)
{
    mUploadMessage = filePathCallback;

    Intent intent = new Intent(Intent.ActionGetContent);
    intent.SetType("*/*");
    // 开启系统文件选择器的多选功能
    intent.PutExtra(Intent.ExtraAllowMultiple, true);
    intent.AddCategory(Intent.CategoryOpenable);

    Intent chooserIntent = Intent.CreateChooser(intent, "选择文件");
    StartActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);

    return true;
}

关键说明

  • Intent.ExtraAllowMultiple:该参数开启系统文件选择器的多选能力,是实现多文件上传的核心配置。
  • ClipData:用户选择多个文件时,系统会通过data.ClipData返回所有选中文件的Uri集合,需遍历获取每个Uri。
  • 兼容性:方案适配Android 5.0(API Level 21)及以上版本,覆盖当前主流设备。

内容的提问来源于stack exchange,提问作者Arvind Tyagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:17:50