Cargar imagen desde una URL en Android

En este post, les explicaré como obtener una imagen desde la web para visualizarla en nuestro dispositivo móvil.

Aquí va el código


URL imageUrl = null;
 HttpURLConnection conn = null;

 try {

 imageUrl = new URL("http://pagina.com/foto.jpg");
 conn = (HttpURLConnection) imageUrl.openConnection();
 conn.connect();
 Bitmap imagen = BitmapFactory.decodeStream(conn.getInputStream());
 img.setImageBitmap(imagen);

 } catch (IOException e) {

 e.printStackTrace();

 }

El truco es utilizar las clases HttpURLConnection y BitmapFactory para obtener los bytes de la imagen de la URL, y luego decodificarla y volcarla en un Bitmap para cargarla en algún ImageView o ImageButton.

El objeto img es un ImageView en este caso. Así de fácil podemos hacer uso de imagenes externas a nuestra aplicación , lo que nos ahorra espacio y hace que la aplicación sea un poco menos pesada.

Finalmente para poder realizar la conexión satisfactoriamente, necesitamos obviamente del permiso de Internet. Para ello agregamos esta línea en nuestro AndroidManifest.xml .

<uses-permission android:name="android.permission.INTERNET" />

 
Actualizo la entrada con la solución al problema de rebasamiento de memoria


URL imageUrl = null;
 HttpURLConnection conn = null;

 try {

 imageUrl = new URL("http://pagina.com/foto.jpg");
 conn = (HttpURLConnection) imageUrl.openConnection();
 conn.connect();
 
 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 2; // el factor de escala a minimizar la imagen, siempre es potencia de 2

 Bitmap imagen = BitmapFactory.decodeStream(conn.getInputStream(), new Rect(0, 0, 0, 0), options);
 img.setImageBitmap(imagen);

 } catch (IOException e) {

 e.printStackTrace();

 }


25 thoughts on “Cargar imagen desde una URL en Android

      1. Hola, buen post, pero tengo un problema no se si me puedas ayudar, lo que trato de hacer es cargar imagenes desde internet y meterlas a un listview pero me da error de memoria dispoible revazada, guarde los bitmap en memoria cache pero sigue sin funcionar, podrias decirme si sabes a que se debe?

      2. Hola si, me ha pasado. Seguramente las imagenes pesen mucho, y aunque los guardes en la cache, al momento de almacenar los bitmaps te estas sobrepasando del espacio de memoroa ram disponible para la actividad. Para esto se suele reducir el tamaño de los bitmaps utilizando la.propiedad options de la clase BitmapFactory. Hoy imtentare actualizar la emtrada con estr agregado asi podes solucionar el problema.

  1. Hola amigo, muchas gracias por tu post y disculpa la molestia pero dentro del primer código tienes una variable “img” que no esta declarada. ¿Me puedes decir de que tipo es?. Grecias

      1. Hola, a mí me da el mismo error. Tengo los permisos dados, y he probado a copiar varias url de imágenes de internet, de google y de otras páginas. Y nada! No sé que más puede ser…

  2. Hola. He hecho un debug, y después de la instrucción:

    “conn = (HttpURLConnection) imageUrl.openConnection();”

    A la variable conn se le asigna id= 830027210344, es decir, que no es null. Parece que está bien, pero cuando hace el:

    “conn.connect();”

    Me sigue dando error. Y repito que tengo puesto en el Manifiest.xml:

    “uses-permission android:name=”android.permission.INTERNET”

    En el LogCat me dice los siguientes errores (a parte de que falla el connect):

    -at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
    -at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java82)
    -at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
    -at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectnImpl.java:80)

    Llevo una semana con este error y no avanzo, por favor, necesito ayuda!!

  3. Hola, tengo problemas con el cache, no me carga las imagenes cuando lo corro desde el telefono, en el emulador se ven correctamente, y la idea es que la imagen tome el tamaño correcto, porque si lo achico no es lo que quiero. de que forma podria solucionar esto?
    muchas gracias por la ayuda.

  4. Me saca este error: 09-03 08:46:59.157 12163-12163/com.example.jhon.yoprefiero E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache
    09-03 08:46:59.161 12163-12163/com.example.jhon.yoprefiero E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384
    09-03 08:46:59.181 12163-12163/com.example.jhon.yoprefiero E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
    09-03 08:46:59.185 12163-12163/com.example.jhon.yoprefiero E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 16384 no me da:/

  5. men tu disculpa pero en donde va el código que estas mostrando o si no es mucho pedir podes mandarme el código del programa por favor ando descabezado con esto y ya llevo como 5 dias buscando y nada que me sale

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s