downloadlistener无法正常工作

时间:2010-10-13 18:10:30

标签: android

DownloadListener应该如何工作?可能我想念一些东西。我做了以下事情:

  • 在WebView上注册DownloadListener。
  • 使用HTML页面打开WebView,其中包含链接(工作)。
  • 如果单击该链接,则不会调用DownloadListener。

以下是代码的一小部分。

package rene.android.learnit;

import android.app.*;
import android.os.Bundle;
import android.webkit.*;

public class ShowWeb extends Activity 
    implements DownloadListener
{
    public static Lesson L;

    WebView WV;

    @Override
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.showweb);

        WV=(WebView)findViewById(R.id.showweb);
        WV.setDownloadListener(this);
        WV.loadUrl("http://android.rene-grothmann.de/courses.html");

    }

    public void onDownloadStart (String url, String agent, String disposition,
            String mimetype, long size)
    {
        Main.log(url+" "+mimetype+" "+size);
    }
}

日志记录工作(我在任何地方使用它来检查我的程序),但没有记录任何内容,因此不会调用回调。会发生什么:视图尝试下载文件,但失败了,因为我的Android不支持zip文件。

链接转到zip文件。这是通常的

<a href=...>...</a>

链接。

我试图找出注册zip文件意图的替代方法。但是文档很少,我不能这样做。如果必须,是否有例子?

有什么想法吗?

谢谢,R。

5 个答案:

答案 0 :(得分:2)

似乎DownloadListener确实无效。但是,可以使用以下技巧:

package rene.android.learnit;

    import android.app.*;
    import android.os.Bundle;
    import android.webkit.*;

    public class ShowWeb extends Activity 
    {
        public static Lesson L;

        WebView WV;

        @Override
        public void onCreate (Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.showweb);

            WV=(WebView)findViewById(R.id.showweb);
            WV.setWebViewClient(new WebViewClient()
            {
                public void onLoadResource (WebView view, String url) 
                {
                    Main.log(url);
                    if (url.endsWith(".zip"))
                    {
                        finish();
                    }
                    else super.onLoadResource(view,url);
                }           
            }
            );
            WV.loadUrl("http://android.rene-grothmann.de/courses.html");

        }
    }

这将允许处理所有zip文件。

答案 1 :(得分:2)

它无效的原因是您将onDownloadStart方法放在了错误的位置。

为了能够加载您在WebView的第一个加载页面上选择的链接,您需要创建一个扩展WebViewClient的私有类。在此课程中,您将覆盖shouldOverrideUrlLoading(WebView v, String url),否则内置浏览器将打开新网址。

此示例解释了:http://developer.android.com/guide/tutorials/views/hello-webview.html

然后,在onCreate()方法集webview.setWebViewClient(new WebViewClient())中。为了能够触发下载事件,您的WebViewClient(您在上面的示例中创建的)会实现DownloadListener并覆盖onDownloadStart方法。

示例:

private class WVClient extends WebViewClient implements DownloadListener {
    @Override
    public boolean shouldOverrideUrlLoading(WebView v, String u) {
        v.loadUrl(u);
        v.setDownloadListener(this);
        return true;
    }

    @Override
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
        Log.i(TAG, "Download: " + url);
        Log.i(TAG, "Length: " + contentLength);
    }
}

答案 2 :(得分:0)

确保:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
if(ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {...

答案 3 :(得分:0)

尝试一下,我100%肯定会成功

  1. 像这样创建自己的WebClient
public class WVClient extends WebViewClient implements DownloadListener {
    private static final String TAG = "WVClient";
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.getUrl().toString());
        view.setDownloadListener(this);
        return super.shouldOverrideUrlLoading(view, request);
    }
    @Override
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
        Log.d(TAG, "manageDownloadsAction: URL:" + url);
        Log.d(TAG, "manageDownloadsAction: UserAgent:" + userAgent);
        Log.d(TAG, "manageDownloadsAction: contentDisposition:" + contentDisposition);
        Log.d(TAG, "manageDownloadsAction: mimeType:" + mimetype);
        Log.d(TAG, "manageDownloadsAction: contentLength:" + contentLength);
    }
  1. 然后设置您的WebClient。
mWebView.setWebViewClient(new WVClient());

答案 4 :(得分:0)

启用以下 WebSettings 选项后,一切顺利。

WebSettings settings = webView.getSettings();
    settings.setLoadsImagesAutomatically(true);