为什么Downloadlistener的OnDownloadStart方法从不被调用
本文关键字:调用 方法 Downloadlistener OnDownloadStart 为什么 | 更新日期: 2023-09-27 18:11:06
也许你能帮我。
我正在用c#开发一个Android应用程序。在我开发ASP之前。. NET页面,现在应该在应用程序中实现。因此,我使用了webview,一切都很好。但是我不能从服务器上下载任何文件,这些文件是我在ASP中动态创建的。网络页面。
我试图实现一个下载监听器,但OnDownloadStart方法从未被调用。
下面是我的部分代码。
OnCreate方法:
... some Code
// Init Webview
var webViewMain = FindViewById<WebView> (Resource.Id.webViewMain);
webViewMain.Settings.JavaScriptEnabled = true;
webViewMain.SetWebViewClient (new MyCustomWebViewClient ());
webViewMain.SetWebChromeClient (new WebChromeClient ());
webViewMain.LoadUrl (LoadUrl);
WebViewClient类:
private class MyCustomWebViewClient: WebViewClient, IDownloadListener {
... some Code
public void OnDownloadStart (string url, string userAgent, string contentDisposition, string mimetype, long contentLength)
{
Intent i = new Intent(Intent.ActionView);
i.SetData(Android.Net.Uri.Parse("url"));
}
}
ASP。. NET下载代码:
... some Code
//ByteArray
var client = new WebClient();
long length = dataFile.Length;
byte[] buffer = client.DownloadData(dataFile.FullName);
File.Delete(dataFile.FullName);
// Send to User
page.Response.Clear();
page.Response.ClearHeaders();
page.Response.ClearContent();
page.Response.AddHeader("content-disposition", "attachment; filename=" + dataFile.Name);
page.Response.AddHeader("Content-Lengt", length.ToString());
page.Response.ContentType = "application/octet-stream";
page.Response.BinaryWrite(buffer);
page.Response.End();
非常感谢你的建议
对于任何感兴趣的人来说,我没有解决这个问题,但我发现了一个小的解决方法。
在我的ASP中使用response . redirect()命令。. NET页面到文件url,我可以在WebViewClient的ShouldOverrideUrlLoading方法中处理下载。
public override bool ShouldOverrideUrlLoading(WebView view, System.String url) {
// handle different requests for different type of files
// this example handles downloads requests for files
// everything else the webview can handle normally
if (url.EndsWith(".pdf") || url.EndsWith(".csv")) {
var source = Android.Net.Uri.Parse (url);
// Make a new request pointing to the .csv url
var request = new DownloadManager.Request(source);
request.AllowScanningByMediaScanner();
request.SetNotificationVisibility(Android.App.DownloadVisibility.VisibleNotifyCompleted);
// save the file in the "Downloads" folder of SDCARD
request.SetDestinationInExternalPublicDir(Android.OS.Environment.DirectoryDownloads, source.LastPathSegment);
// get download service and enqueue file
var manager = (DownloadManager) context.GetSystemService(Context.DownloadService);
manager.Enqueue(request);
} else if(url.StartsWith("mailto:")){
var mt = MailTo.Parse(url);
var i = newEmailIntent(mt.To, mt.Subject, mt.Body, mt.Cc);
context.StartActivity(i);
view.Reload(); // Link von Email -> active style wieder entfernen.
} else {
view.LoadUrl(url);
}
return true;
}
我必须解决的另一个问题是,如何删除我动态创建的csv文件。因此,我使用了以下代码:
ASP。. NET计划删除临时文件
谢谢。
我也发现了下载侦听器的方法,因为它看起来比检查。endswith(".pdf")要干净得多,所以我尝试了一下。
Xamarin监听这些事件的方式是:
webView.Download += (object sender, DownloadEventArgs de) => {
if (de.Mimetype=="application/pdf") {
var intent = new Intent (Intent.ActionView, Android.Net.Uri.Parse (de.Url));
webView.Context.StartActivity (intent);
}
};
这有点晚了,但您的问题是您需要添加侦听器,如:
var c = new MyCustomWebViewClient ();
webViewMain.SetWebViewClient (c);
webViewMain.SetDownloadListener(c);