2012-11-27 6 views
5

Ich verwende den universellen Bildlader in einer App, die Bilder von einer autorisierten Quelle abrufen muss.Zugriff auf geschützte Bilder im universellen Bildlader

Bisher habe ich die URLConnectionImageDownloader Klasse mit meiner eigenen Klasse erweitert, und die Methode getStreamFromNetwork mit meiner eigenen Implementierung außer Kraft gesetzt, die die Autorisierungsheader im URLConnection Objekt setzt als solche:

public class authURLConnectionImageDownloader extends URLConnectionImageDownloader { 

@Override 
public InputStream getStreamFromNetwork(URI imageUri) throws IOException { 

    String auth = Base64.encodeToString(("username" + ":"+"psswd").getBytes(), Base64.NO_WRAP); 

    URLConnection conn = imageUri.toURL().openConnection(); 
    conn.setRequestProperty("Authorization", "Basic " + auth); 

    conn.setConnectTimeout(DEFAULT_HTTP_CONNECT_TIMEOUT); 
    conn.setReadTimeout(DEFAULT_HTTP_READ_TIMEOUT); 

    return new FlushedInputStream(new BufferedInputStream(conn.getInputStream(), BUFFER_SIZE));  
} 

und zum Einrichten mein ImageLoader ...

imageLoader = ImageLoader.getInstance(); 

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(MainActivity.this) 
     .imageDownloader(new authURLConnectionImageDownloader()) 
     .build(); 

imageLoader.init(config); 

Bisher konnte ich es nicht zur Arbeit bringen. Das Bild wird nicht heruntergeladen. Aber noch wichtiger, ich habe einen Breakpoint in getStreamFromNetwork() gesetzt und es wird nie getroffen? Was mache ich falsch?

+0

Dank für Lösung! :) – Sadegh

Antwort

4

ich es geschafft, es funktioniert am Ende zu bekommen ...

ich die Bibliothek .jar mit Quelle verwendet, die mit dem Beispiel kommt, und debuggt es. Ich habe gesehen, dass es nie auf meine abgeleitete Klasse URLConnectionImageDownloader zugreift und immer das Elternobjekt verwendet.

Also sah ich meinen Code und sah, dass ich einen anderen Image-Loader innerhalb einer vorherigen Aktivität eingerichtet hatte, der die Standardklasse URLConnectionImageDownloader verwendete.

Jetzt habe ich eine Anwendungsklasse erstellt und meinen ImageLoader einmal eingerichtet (wie in der Beispiel-App), und setzen Sie die Konfiguration, um meine neue authURLConnectionImageDownloader-Klasse zu verwenden. Jetzt benutzen alle meine Aktivitäten diesen ImageLoader und es funktioniert.

12

ich es auf diese Weise umgesetzt:

byte[] toEncrypt = (username + ":" + password).getBytes(); 
     String encryptedCredentials = Base64.encodeToString(toEncrypt, Base64.DEFAULT); 
     Map<String, String> headers = new HashMap(); 
     headers.put("Authorization","Basic "+encryptedCredentials); 

    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
      ... 
      .extraForDownloader(headers) 
      .build(); 

Ihre eigene ImageDownloader erstellen:

public class AuthDownloader extends BaseImageDownloader { 

    public AuthDownloader(Context context){ 
     super(context); 
    } 

    @Override 
    protected HttpURLConnection createConnection(String url, Object extra) throws IOException { 
     HttpURLConnection conn = super.createConnection(url, extra); 
     Map<String, String> headers = (Map<String, String>) extra; 
     if (headers != null) { 
      for (Map.Entry<String, String> header : headers.entrySet()) { 
       conn.setRequestProperty(header.getKey(), header.getValue()); 
      } 
     } 
     return conn; 
    } 
} 

und legen Sie es auf die Konfiguration:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
      .defaultDisplayImageOptions(defaultOptions) 
      .discCacheExtraOptions(600, 600, CompressFormat.PNG, 75, null) 
      .imageDownloader(new AuthDownloader(getApplicationContext())) 
      .build(); 

    ImageLoader.getInstance().init(config); 
+0

Extra Parameter auf createConnection gibt immer Null zurück. – Ricardo

+0

funktioniert perfekt. Du sparst meinen Tag. Danke vielmals. –