2010-07-30 10 views
23

Attualmente sto usando il seguente pezzo di codice per caricare immagini come oggetti disegnabili formano un URL.Immagini disegnabili Android dall'URL

Drawable drawable_from_url(String url, String src_name) 
throws java.net.MalformedURLException, java.io.IOException { 
     return Drawable.createFromStream(((java.io.InputStream)new java.net.URL(url).getContent()), src_name); 

} 

Questo codice funziona esattamente come desiderato, ma sembra che ci siano problemi di compatibilità con esso. Nella versione 1.5, lancia un FileNotFoundException quando gli do un URL. In 2.2, dato lo stesso URL, funziona perfettamente. Il seguente URL è un esempio di input che sto dando a questa funzione.

http://bks6.books.google.com/books?id=aH7BPTrwNXUC&printsec=frontcover&img=1&zoom=5&edge=curl&sig=ACfU3U2aQRnAX2o2ny2xFC1GmVn22almpg 

Come caricare le immagini in modo compatibile su tutta la linea da un URL?

risposta

12

Risolto da solo. L'ho caricato come bitmap usando il seguente codice.

Bitmap drawable_from_url(String url) throws java.net.MalformedURLException, java.io.IOException { 

    HttpURLConnection connection = (HttpURLConnection)new URL(url) .openConnection(); 
    connection.setRequestProperty("User-agent","Mozilla/4.0"); 

    connection.connect(); 
    InputStream input = connection.getInputStream(); 

    return BitmapFactory.decodeStream(input); 
} 

E 'stato anche importante aggiungere nella user agent, come googlebooks nega l'accesso, se è assente

5

Non sono sicuro, ma penso che Drawable.createFromStream() sia più destinato all'uso con i file locali piuttosto che gli InputStreams scaricati. Prova a utilizzare BitmapFactory.decodeStream(), quindi a capo della bitmap di ritorno in un BitmapDrawable.

+0

Mi sembra di ricordare di aver incontrato prima questo problema; Ero al 1,5 alla volta. – I82Much

41

bitmap non è un Drawable. Se davvero bisogno di un Drawable fare questo:

public static Drawable drawableFromUrl(String url) throws IOException { 
    Bitmap x; 

    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
    connection.connect(); 
    InputStream input = connection.getInputStream(); 

    x = BitmapFactory.decodeStream(input); 
    return new BitmapDrawable(x); 
} 

(ho usato la punta si trovano in https://stackoverflow.com/a/2416360/450148)

+0

Ottima risposta, ma si noti che il costruttore è deprecato. Usa BitmapDrawable (Risorse, Bitmap) per assicurarti che il drawable abbia impostato correttamente la sua densità target – avalancha

+0

Per favore modificalo e risolvilo! –

1

Il seguente codice funziona per me:

Matrix Mat = new Matrix(); 

Bitmap Source = BitmapFactory.decodeFile("ItemImagePath"); 

Bitmap Destination = Bitmap.createScaledBitmap(Source, 320, 320, true); 

Source = Bitmap.createBitmap(Destination, 0, 0, Destination.getWidth(), Destination.getHeight(),Mat, true); 

ItemImageView.setImageBitmap(Source); 
+1

questo arresta la mia app – Christopher

+0

@Christopher - si blocca come - il networking sul thread principale? –

1

È possibile utilizzare com.androidquery. AndroidQuery per fare questo abbastanza semplicemente. Per esempio:

AQuery aq = new AQuery(this); 
aq.id(view).image("http://yourserver/yourimage.png", true, true, 300, new BitmapAjaxCallback() { 
     @Override 
     public void callback(String url, ImageView imageView, Bitmap bitmap, AjaxStatus status) { 
      Drawable drawable = new BitmapDrawable(getResources(), bm); 
     } 
    }); 

Se si utilizza il BitmapAjaxCallback avrete accesso alla bitmap che si può avvolgere come un BitmapDrawable.

+0

La domanda non riguarda questo, per favore leggi di nuovo! –

+0

Per favore aiutami, non capisco perché la mia risposta non sia applicabile qui ... –

+0

La persona ha chiesto un modo per creare un drawable da un url, il tuo lo sta facendo sotto, nessun modo di ottenere il ** drawable **, piuttosto si passa una vista e la libreria imposta l'immagine che viene scaricata dall'url. Quindi come può essere considerata una risposta alla domanda? –

Problemi correlati