我正在尝试从我的 MAUI 应用程序下载一些文件。应用程序建立在应该从中下载文件的 webView 上。我的 DownloadListner 中有这个逻辑:
public class CustomDownloadListener : Java.Lang.Object, IDownloadListener
{
public async void OnDownloadStart(string url, string userAgent, string contentDisposition, string mimetype, long contentLength)
{
try
{
DownloadManager.Request request = new DownloadManager.Request(global::Android.Net.Uri.Parse(url.Replace("blob:", "")));
request.SetMimeType(mimetype);
request.SetNotificationVisibility(DownloadVisibility.VisibleNotifyCompleted);
// if this path is not create, we can create it.
string thmblibrary = FileSystem.AppDataDirectory + "/download";
if (!Directory.Exists(thmblibrary))
Directory.CreateDirectory(thmblibrary);
request.SetDestinationInExternalFilesDir(global::Android.App.Application.Context, FileSystem.AppDataDirectory, "download");
DownloadManager dm = (DownloadManager)global::Android.App.Application.Context.GetSystemService(global::Android.App.Application.DownloadService);
dm.Enqueue(request);
}
catch(Exeption ex)
{
}
}
}
这适用于传输应用程序中的大部分文件,但如果 URL 以“blob:https://...”开头,DownloadManager 将抛出异常。在这种情况下,我还尝试从 URL 中删除“blob:”,文件已下载但已损坏。
还有其他方法可以传输这些文件吗?
这是android webview中的限制。
Android DownloadManager 仅用于使用 HTTP / HTTPS 协议下载远程文件。 blob 不是远程数据,而是 WebView 中的某些内容。所以解决方法是将 Blob 转换为 Base64 字符串并将其写入文件。
可以参考在Android WebView中无法下载Blob文件类型的案例和在Android WebViewClient中从网站下载Blob文件。
另外,你可以参考这个案例如何在xamarin.android中使用JavaScriptInterface和他在maui中使用JavaScriptInterface的答案