2012-11-27 13 views
5

Używam uniwersalnego programu ładującego grafikę w aplikacji, która musi pobierać obrazy z autoryzowanego źródła.Uzyskiwanie dostępu do chronionych obrazów w uniwersalnym programie ładującym obrazy

tej pory, mam przedłużony klasę URLConnectionImageDownloader z własnej klasy i nadpisane w getStreamFromNetwork metody z własnego implementacja który ustawia nagłówek autoryzacji w obiekcie URLConnection jako takie:

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

i konfigurowania mój ImageLoader ...

imageLoader = ImageLoader.getInstance(); 

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

imageLoader.init(config); 

Do tej pory nie mogłem go uruchomić. Obraz nie został pobrany. Ale co ważniejsze, umieściłem punkt przerwania w getStreamFromNetwork() i to nigdy nie jest trafione? Co ja robię źle?

+0

Dzięki za rozwiązanie! :) – Sadegh

Odpowiedz

4

udało mi się dostać pracy w końcu ...

użyłem .jar biblioteki ze źródła, które pochodzi z przykładu i debugowania go. Widziałem, że nigdy nie uzyskiwał dostępu do mojej klasy pochodnej URLConnectionImageDownloader i zawsze korzystał z elementu nadrzędnego.

Spojrzałem na mój kod i zobaczyłem, że ustawiłem kolejny imageloader w ramach poprzedniego działania, które używało domyślnej klasy URLConnectionImageDownloader.

Teraz stworzyłem klasę aplikacji i skonfigurowałem mój ImageLoader raz (jak w przykładowej aplikacji) i ustawiłem konfigurację tak, aby używała mojej nowej klasy authURLConnectionImageDownloader. Teraz wszystkie moje działania używają tego ImageLoadera i to działa.

12

I wprowadziły go w ten sposób:

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

Stwórz własną 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; 
    } 
} 

i ustawić go do konfiguracji:

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

Dodatkowy parametr na createConnection zwraca zawsze wartość null. – Ricardo

+0

działa idealnie. oszczędzasz mój dzień. Wielkie dzięki. –

Powiązane problemy