2010-10-13 5 views
3

Comment le DownloadListener est-il supposé fonctionner? Il me manque probablement quelque chose. J'ai fait ce qui suit:downloadlistener ne fonctionne pas

  • Enregistrer un DownloadListener à un WebView.
  • Ouvrez un WebView avec une page HTML, contenant un lien (fonctionne).
  • Si je clique sur le lien, le DownloadListener n'est pas appelé.

Voici une courte partie du 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); 
    } 
} 

Les œuvres d'exploitation forestière (je me sers de ce partout pour vérifier mon programme), mais rien Connectées, donc le rappel n'est pas appelée. Qu'est-ce qui se passe est: La vue essaie de télécharger le fichier, et échoue, car les fichiers zip ne sont pas pris en charge sur mon Android.

Le lien va vers un fichier zip. C'est un habituel

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

lien.

J'ai essayé de trouver la méthode alternative d'enregistrement d'une intention pour les fichiers zip. Mais la documentation est si clairsemée, je ne pouvais pas faire ça. Si je dois, y a-t-il un exemple?

Des idées?

Merci, R.

Répondre

0

Il semble que le DownloadListener est en effet ne fonctionne pas. Cependant, on peut utiliser l'astuce suivante:

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

     } 
    } 

Cela permettra de gérer tous les fichiers zip.

2

La raison pour laquelle cela ne fonctionne pas est que vous avez placé la méthode onDownloadStart au mauvais endroit.

Pour pouvoir charger les liens que vous sélectionnez sur votre première page chargée dans votre WebView, vous devez créer une classe privée qui étend un WebViewClient. Dans cette classe, vous remplacez shouldOverrideUrlLoading(WebView v, String url) sinon le navigateur intégré ouvrira la nouvelle URL à la place.

Cet exemple explique que: http://developer.android.com/guide/tutorials/views/hello-webview.html

Ensuite, dans votre méthode onCreate() mis webview.setWebViewClient(new WebViewClient()). Pour pouvoir déclencher sur un événement de téléchargement laissez votre WebViewClient (que vous avez créé à partir de l'exemple ci-dessus) implémenter DownloadListener et remplacer la méthode onDownloadStart.

Exemple:

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

Ensuite, vous devez créer votre propre code qui fait quelque chose avec faire l'URL fournie. J'ai utilisé Log.i() uniquement à des fins de débogage. – Magnus