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

.NET MAUI WebView文件上传功能失效求助

.NET MAUI WebView 文件上传解决方案

1. 完善权限配置

在AndroidManifest.xml中,除你已添加的权限外,针对Android 13及以上版本需补充媒体权限(READ_EXTERNAL_STORAGE在Android 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" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

2. 动态请求权限

在页面后台代码中添加权限请求逻辑,确保用户完成授权:

using Microsoft.Maui.ApplicationModel;
using Microsoft.Maui.Permissions;

private async Task RequestPermissions()
{
    PermissionStatus status;
    if (DeviceInfo.Platform == DevicePlatform.Android)
    {
        if (DeviceInfo.Version.Major >= 13)
        {
            status = await Permissions.CheckStatusAsync<Permissions.Media>();
            if (status != PermissionStatus.Granted)
            {
                status = await Permissions.RequestAsync<Permissions.Media>();
            }
        }
        else
        {
            status = await Permissions.CheckStatusAsync<Permissions.StorageWrite>();
            if (status != PermissionStatus.Granted)
            {
                status = await Permissions.RequestAsync<Permissions.StorageWrite>();
            }
        }
    }
}

protected override async void OnAppearing()
{
    base.OnAppearing();
    await RequestPermissions();
}

3. 自定义Android WebView Handler

在Platforms/Android目录下创建CustomWebViewHandler.cs,处理文件选择回调:

using Android.App;
using Android.Content;
using Android.Webkit;
using Microsoft.Maui.Handlers;

namespace YourAppNamespace.Platforms.Android;

public class CustomWebViewHandler : WebViewHandler
{
    private static WebChromeClient _webChromeClient;

    protected override void ConnectHandler(Android.Webkit.WebView platformView)
    {
        _webChromeClient = new MauiWebChromeClient();
        platformView.SetWebChromeClient(_webChromeClient);
        base.ConnectHandler(platformView);
    }

    protected override void DisconnectHandler(Android.Webkit.WebView platformView)
    {
        platformView.SetWebChromeClient(null);
        _webChromeClient = null;
        base.DisconnectHandler(platformView);
    }
}

public class MauiWebChromeClient : WebChromeClient
{
    public override bool OnShowFileChooser(Android.Webkit.WebView webView, IValueCallback filePathCallback, FileChooserParams fileChooserParams)
    {
        Intent intent = fileChooserParams.CreateIntent();
        try
        {
            ((Activity?)Platform.CurrentActivity)?.StartActivityForResult(Intent.CreateChooser(intent, "选择文件"), 1000);
            FileUploadCallbackHelper.FilePathCallback = filePathCallback;
            return true;
        }
        catch (ActivityNotFoundException)
        {
            FileUploadCallbackHelper.FilePathCallback = null;
            return false;
        }
    }
}

public static class FileUploadCallbackHelper
{
    public static IValueCallback? FilePathCallback { get; set; }
}

在Platforms/Android/MainActivity.cs中重写OnActivityResult处理文件选择结果:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent? data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (requestCode == 1000)
    {
        if (FileUploadCallbackHelper.FilePathCallback == null)
            return;

        var result = WebChromeClient.FileChooserParams.ParseResult((int)resultCode, data);
        FileUploadCallbackHelper.FilePathCallback.OnReceiveValue(result);
        FileUploadCallbackHelper.FilePathCallback = null;
    }
}

在MauiProgram.cs中注册自定义Handler:

builder.ConfigureMauiHandlers(handlers =>
{
#if ANDROID
    handlers.AddHandler(typeof(WebView), typeof(YourAppNamespace.Platforms.Android.CustomWebViewHandler));
#endif
});

4. 页面中使用WebView

在XAML页面添加WebView:

<WebView x:Name="UploadWebView" Source="https://your-upload-page-url.com" />

内容的提问来源于stack exchange,提问作者Arif-Uz-Zaman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:15:05