也许你可以帮助我。:)
我在C#中使用Xamarin开发Android应用程序。在我开发ASP.NET页面之前,现在应该在应用程序中实现。因此我使用了webview,一切正常。但我无法从服务器下载任何文件,我在ASP.NET页面中动态创建。
我尝试实现了一个downloadlistener,但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();
非常感谢您的建议:)
答案 0 :(得分:0)
对于任何有兴趣的人,我没有解决问题,但我找到了一些解决方法。
通过在我的ASP.NET页面中使用Respone.Redirect()命令,到文件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 Schedule deletion of temporary files
感谢。
答案 1 :(得分:0)
我也找到了下载监听器方法,因为它似乎比检查.endswith(“。pdf”)更干净。我试过了。
使用Xamarin监听这些事件的方法是:
< 0
答案 2 :(得分:0)
有点晚了,但问题是您需要添加监听器,如:
var c = new MyCustomWebViewClient ();
webViewMain.SetWebViewClient (c);
webViewMain.SetDownloadListener(c);