Xamarin Android WebView下载文件无响应

3
我有一个Webview,显示一个我不知道其工作原理的网站。
在这个网站上有几个按钮,可以下载各种即时生成的文件。以下是其中一个按钮使用的URL请求示例:test.example.com/Test/Export/Stuff?format=Pdf
这会导致桌面浏览器和手机Chrome上下载文件,但我的应用程序上没有任何反应。
我已经在互联网上搜索了解决方案,但找不到有效的方法。
我已经尝试设置DownloadListener,如https://forums.xamarin.com/discussion/4605/download-file-by-webview所述,但OnDownloadStart从未触发。
我还尝试拦截URL请求,在自定义WebViewClient中使用ShouldOverrideUrlLoading,如其他帖子中所述,但也没有成功。
以下是该按钮的HTML代码:
<input id="exportPdfButton" class="secondary hover" format="Pdf" value="Download (PDF)" name="exportPdfButton" type="submit">
<script id="dxss_848651839" type="text/javascript">

<!--

var dxo = new MVCxClientButton('exportPdfButton');
dxo.InitGlobalVariable('exportPdfButton');
dxo.SetProperties({'autoPostBack':true,'isNative':true});
dxo.SetEvents({'Click':ExportButtonOnClick});
dxo.AfterCreate();

//-->
</script>

我已经设置了ACCESS_DOWNLOAD_MANAGER、WRITE_EXTERNAL_STORAGE等权限。
请问有人可以帮我解决如何在应用程序中下载这些文件的问题吗?或者,我能提供哪些其他信息来帮助解决这个问题呢?

当您使用POST来初始化下载时,似乎存在下载问题。我也遇到了同样的问题。只有在使用GET调用下载时,Downloadmanager才能正常工作。 - David
1个回答

2

有人能帮我弄清楚如何在应用程序中下载这些文件吗?

首先,请确保您的WebView已启用JavaScript,并正确设置了WebViewClient:

mWebview = FindViewById<WebView>(Resource.Id.mWebview);
mWebview.Download += MWebview_Download;
var client = new WebViewClient();
mWebview.Settings.JavaScriptEnabled = true;
mWebview.SetWebViewClient(client);

mWebview.LoadUrl("your url");

然后在 WebView.Download 事件中使用 DownloadManager 下载文件:

private void MWebview_Download(object sender, DownloadEventArgs e)
{
    var url = e.Url;
    DownloadManager.Request request = new DownloadManager.Request(Uri.Parse(url));

    request.AllowScanningByMediaScanner();
    request.SetNotificationVisibility(DownloadManager.Request.VisibilityVisibleNotifyCompleted); //Notify client once download is completed!
    request.SetDestinationInExternalPublicDir(Environment.DirectoryDownloads, "CPPPrimer");
    DownloadManager dm = (DownloadManager)GetSystemService("download");
    dm.Enqueue(request);
    Toast.MakeText(ApplicationContext, "Downloading File",ToastLength.Long//To notify the Client that the file is being downloaded
                ).Show();
    }

是的,我已经启用了JavaScript并设置了客户端。我尝试过使用.Download事件,但当单击按钮时它根本不触发。 - CJM
那么很可能是js脚本的问题。能否请您发布“Download(PDF)”函数的js代码? - Elvis Xia - MSFT
它似乎没有使用JavaScript,我必须承认我对JavaScript非常陌生。但从我所看到的,它在包含表单中使用了一个Post方法。 <form id="exportForm" action="/Test/Export/Stuff" method="post" novalidate="novalidate"> - CJM
这正是问题所在,webview 不允许您访问 http 响应内容。请参考这个案例。因此,您应该使用 HttpClient,而不是使用 webview - Elvis Xia - MSFT
1
我已经尝试了上述解决方案。它返回了损坏的PDF文件,但我无法打开该文件。它显示一个错误消息“无法打开PDF”。我在手机上安装了PDF阅读器。 - Alpesh
嗨,Alpesh,我也遇到了同样的问题。你能指导我一下吗? - Vishal Khunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接