Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
334 views
in Technique[技术] by (71.8m points)

android - downloadlistener not working

How is the DownloadListener supposed to work? Probably I miss something. I did the following:

  • Register a DownloadListener at a WebView.
  • Open a WebView with a HTML page, containing a link (works).
  • If I click on the link, the DownloadListener is not called.

Here is a short portion of the code.

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);
    }
}

The logging works (I am using this everywhere to check my program), but nothing is logged, so the callback is not called. What happens is: The view tries to download the file, and fails, since zip files are not supported on my Android.

The link goes to a zip-file. It is a usual

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

link.

I tried to figure out the alternative method of registering an intent for zip files. But the documentation is so sparse, I could not do that. If I have to, is there an example?

Any ideas?

Thanks, R.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The reason it doesn't work is that you have put the onDownloadStart method in the wrong place.

To be able to load links that you select on your first loaded page in your WebView you need to create a private class extending a WebViewClient. In this class you override shouldOverrideUrlLoading(WebView v, String url) otherwise the built-in browser will open the new URL instead.

This example explains that: http://developer.android.com/guide/tutorials/views/hello-webview.html

Then, in your onCreate() method set webview.setWebViewClient(new WebViewClient()). To be able to trigger on a download event let your WebViewClient (that you created from the example above) implement DownloadListener and override the onDownloadStart method.

Example:

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);
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...