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

 }

Anuncios

30 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

  6. Primero que nada gracias por el código, ahora a mi me dio problemas al inicio en la linea “conn.connect();” , esto lo solucione haciendo el proceso en un hilo , ya que todos conexión a Internet necesita de 2 cosas , los permisos en el manifest
    “uses-permission android:name=”android.permission.INTERNET”

    para acceder a internet y el subproceso para evitar que el proceso principal deje de funcionar.

    otro punto que me dio problema fue que solo me mostraba algunas imágenes de cierto tamañp y no todas , esto me daba por no tener el URL correcto y tambien por la linea

    options.inSampleSize = 2

    esta linea la cambien a 6 , entre mas grande el numero mas grande se ve la imagen aun que la calidad se pierde

    en fin el subproceso queda de la siguiente manera

    la linea siguiente llama a la ejecución del hilo o subproceso,se coloca donde se desea cargar la imagen en mi caso yo lo coloque en el OnCreate de la ventana

    new Hilo_VerFoto().execute(“”);
    ————————————————————————————————-
    Tiene que tener el objeto ImagenView y asignarle la memoria en el Oncreate

    primero crear la variable publica global en la ventana

    public ImageView img_Articulo;

    luego en el oncreate se le asigna el espacio en memoria

    img_Articulo = (ImageView) findViewById(R.id.img_Articulo);

    ahora la siguiente clase(HILO) se pone al final y dentro de la clase principal de la ventana y se accede a como mencione anteriormente con

    new Hilo_VerFoto().execute(“”);

    /*Algo importante es mencionar que la aginacion de la imagen al objeto ImagenView debe hacerte en la funcion onPostExecute ya que solo en esa y en onPreExecute se tiene acceso a los elementos de la interfaz*/

    public class Hilo_VerFoto extends AsyncTask {
    public String CodigoArticulo=””;
    URL imageUrl = null;
    HttpURLConnection conn = null;

    @Override
    protected String doInBackground(String… params) {
    try {
    imageUrl = new URL(“http://bourneycia.net/img/Articulos/” + CodigoArticulo + “.jpg”);
    } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    try {
    conn = (HttpURLConnection) imageUrl.openConnection();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    try {
    conn.connect();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 6; // el factor de escala a minimizar la imagen, siempre es potencia de 2

    try {
    imagen = BitmapFactory.decodeStream(conn.getInputStream(), new Rect(0, 0, 0, 0), options);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return null;
    }

    //ANTES de ejecutar el HILO
    @Override
    protected void onPreExecute() {
    CodigoArticulo=cod;
    super.onPreExecute();
    };

    @Override
    protected void onProgressUpdate(Integer… values) {
    super.onProgressUpdate(values);
    }

    //DESPUES de Generar el proceso en segundo plano
    @Override
    protected void onPostExecute(String result) {

    img_Articulo.setImageBitmap(imagen);
    }
    }//fi de clase1

  7. Saludos, buen post:
    tengo un problema en esta línea:

    conn = (HttpURLConnection) imageUrl.openConnection();
    conn.connect(); //esto da error

    Revisé el manifest y todo esta perfecto, revisé la url y todo perfecto, por ende no se cual pueda ser el error y me puedas ayudar.

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