2010-07-30 7 views
23

Je suis actuellement en utilisant le morceau de code suivant pour charger dans les images sous forme d'objets dessinables forment une URL.Android Dessiner des images à partir de l'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); 

} 

Ce code fonctionne exactement comme souhaité, mais il semble y avoir des problèmes de compatibilité avec celui-ci. Dans la version 1.5, il lance un FileNotFoundException lorsque je lui donne une URL. En 2.2, étant donné exactement la même URL, cela fonctionne très bien. L'URL suivante est un exemple d'entrée que je donne à cette fonction.

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

Comment charger des images d'une manière compatible avec une URL?

Répondre

12

Résolu moi-même. Je l'ai chargé en tant que bitmap en utilisant le code suivant.

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

Il est également important d'ajouter à l'agent utilisateur, comme googlebooks refuse l'accès si elle est absente

5

Je ne suis pas sûr, mais je pense que Drawable.createFromStream() est plus destiné à être utilisé avec des fichiers locaux plutôt que des InputStreams téléchargés. Essayez d'utiliser BitmapFactory.decodeStream(), puis en enveloppant le bitmap de retour dans un BitmapDrawable.

+0

Je me souviens d'avoir déjà rencontré ce problème; J'étais sur 1,5 à l'époque. – I82Much

41

Bitmap est pas un Drawable. Si vous avez vraiment besoin d'un Drawable faire:

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

(j'ai utilisé la pointe trouve dans https://stackoverflow.com/a/2416360/450148)

+0

Bonne réponse, mais notez que le constructeur est obsolète. Utilisez BitmapDrawable (Resources, Bitmap) pour vous assurer que le drawable a correctement défini sa densité de cible. – avalancha

+0

Veuillez le modifier et corriger! –

1

Le code suivant fonctionne pour moi:

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

cela bloque mon application – Christopher

+0

@Christopher - bloque comment - mise en réseau sur le fil principal? –

1

Vous pouvez utiliser com.androidquery. AndroidQuery pour le faire tout simplement. Par exemple:

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

Si vous utilisez le BitmapAjaxCallback vous aurez accès à la BitMap que vous pouvez envelopper comme BitmapDrawable.

+0

La question n'est pas à ce sujet, s'il vous plaît relire! –

+0

S'il vous plaît aidez-moi, je ne comprends pas pourquoi ma réponse ne s'applique pas ici ... –

+0

La personne a demandé un moyen de créer un drawable à partir d'une url, le vôtre fait cela en dessous, pas moyen d'obtenir le ** drawable **, plutôt que vous passez une vue et la bibliothèque définit l'image sur ce qui est téléchargé à partir de l'url.So comment il peut être considéré comme une réponse à la question? –