.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
相关产品推荐
相关产品推荐

