2010-07-30 22 views
23

Actualmente estoy usando la siguiente pieza de código para cargar imágenes como objetos dibujables de una URL.Android Drawable Images from 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); 

} 

Este código funciona exactamente como quería, pero no parece haber problemas de compatibilidad con ella. En la versión 1.5, arroja un FileNotFoundException cuando le doy una URL. En 2.2, dada la misma URL, funciona bien. La siguiente URL es una entrada de muestra. Estoy dando esta función.

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

¿Cómo se cargarán las imágenes de forma compatible con una URL desde todos los ángulos?

Respuesta

12

Resuelto yo mismo. Lo cargué como un mapa de bits usando el siguiente código.

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

También era importante añadir en el agente de usuario, como GoogleBooks deniega el acceso si está ausente

5

No estoy seguro, pero creo que Drawable.createFromStream() es más adecuado para el uso con archivos locales en lugar de descargar InputStreams. Intente usar BitmapFactory.decodeStream(), y luego ajuste el mapa de bits de retorno en un BitmapDrawable.

+0

Parece que recuerdo haber tenido ese problema antes; Estaba en 1.5 en ese momento. – I82Much

41

mapa de bits no es un Disponibles. Si realmente necesita un Disponibles hacer esto:

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

(que utiliza la punta se encuentra en https://stackoverflow.com/a/2416360/450148)

+0

Excelente respuesta, pero tenga en cuenta que el constructor está en desuso. Utilice BitmapDrawable (Resources, Bitmap) para asegurarse de que el dibujo haya configurado correctamente su densidad objetivo – avalancha

+0

¡Edite y solucione el problema! –

1

El siguiente código funciona para mí:

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

esto bloquea mi aplicación – Christopher

+0

@Christopher - se bloquea cómo - redes en el hilo principal? –

1

Puede utilizar com.androidquery. AndroidQuery para hacer esto simplemente. Por ejemplo:

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 utiliza el BitmapAjaxCallback tendrá acceso al mapa de bits que se puede envolver como BitmapDrawable.

+0

¡La pregunta no es sobre esto, por favor lea otra vez! –

+0

Por favor, ayúdenme, no entiendo por qué mi respuesta no es aplicable aquí ... –

+0

La persona solicitó una forma de crear un dibujable de una url, la suya está haciendo eso debajo, no hay forma de obtener el ** dibujable **, más bien pasas una vista y la biblioteca establece la imagen que se descarga desde la url. Entonces, ¿cómo se puede considerar como una respuesta para la pregunta? –