为什么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();

非常感谢你的建议

为什么Downloadlistener的OnDownloadStart方法从不被调用

对于任何感兴趣的人来说,我没有解决这个问题,但我发现了一个小的解决方法。

在我的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);