2012-11-27 11 views
5

Sto utilizzando il caricatore universale di immagini in un'app che deve recuperare le immagini da una fonte autorizzata.Accesso alle immagini protette nel caricatore universale di immagini

Finora, ho esteso la classe URLConnectionImageDownloader con la mia classe, e sovrascritto il metodo getStreamFromNetwork con la mia Implementazione che imposta l'intestazione di autorizzazione nell'oggetto URLConnection in quanto tale:

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

e per la creazione di mia ImageLoader ...

imageLoader = ImageLoader.getInstance(); 

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

imageLoader.init(config); 

Finora ho in grado di farlo funzionare. L'immagine non è stata scaricata. Ma ancora più importante ho inserito un punto di interruzione in getStreamFromNetwork() e non viene mai colpito? Che cosa sto facendo di sbagliato?

+0

Grazie per la soluzione! :) Il parametro aggiuntivo – Sadegh

risposta

4

sono riuscito a farlo funzionare alla fine ...

ho usato il .jar libreria con la fonte che viene fornito con l'esempio, e il debug di esso. Ho visto che non stava mai accedendo alla mia classe derivata da URLConnectionImageDownloader e usavo sempre il genitore.

Così ho visto il mio codice e ho visto che stavo configurando un altro imageloader all'interno di un'attività precedente che utilizzava la classe predefinita URLConnectionImageDownloader.

Ora ho creato una classe di applicazione e ho impostato il mio ImageLoader una volta (come nell'app di esempio), e ho impostato la configurazione per usare la mia nuova classe authURLConnectionImageDownloader. Ora tutte le mie attività utilizzano questo ImageLoader e funziona.

12

ho implementato in questo modo:

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

Crea il tuo ImageDownloader:

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

e impostarlo alla configurazione:

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

su createConnection restituisce sempre null. – Ricardo

+0

funziona perfettamente. tu salva la mia giornata. Molte grazie. –

Problemi correlati