23 comentarios el “Descargar Imagen desde Url en Android

  1. Pingback: Guardar Imagen en Memoria Interna Android « SekthDroid

  2. Muy buen tutorial, solo me gustaria consultar, como hago que esto funcione con un boton?

    Saludos desde El Salvador

    • Buenas Gerson, como ves en el tutorial todo se realiza en el método onCreate, es decir cuando se está generando la Activity. Si quieres que se ejecute con un botón, bastaría con agregarlo en la UI, y añadirle un onClickListener, o bien mediante el atributo onClick del xml, y dentro de el instanciar la AsynkTask y ejecutarla. Debido a que no estoy en mi casa y no tengo internet no puedo ponerte un ejemplo ahora mismo, ya que estoy en el ejemplo, en cuanto vuelva te pongo el código de ejemplo con un botón por si sirve de ayuda. Saludos y siento ahora mismo no poder ponerte el ejemplo, pero desde el movil es complicado 🙂

  3. Hola, gran tuto… una pregunta.. adonde guarda la imagen que se descargo, en cache.. en la memoria interna o externa ? es q necesito crear llamar una serie de imagenes dinamicamente desde internet y son grandes para un movil, no se siguardarlas en cache o descargarlas primero en la sd y luego llamarlas en tiempo de ejecucion, y de ser asi como se hace esto??

  4. Buenas Johann,

    En esta entrada lo único que se hace es descargar una imagen y colocarla en un ImageView, pero no la guarda ni en la memoria interna ni externa.

    Para guardarlo en la memoria externa, debes usar algo parecido a lo que aparece en Android Developer. Lo primero comprobar si está disponible y se puede escribir en ella:

    /* Checks if external storage is available for read and write */
    public boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        }
        return false;
    }
    
    /* Checks if external storage is available to at least read */
    public boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state) ||
            Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
    }
    

    Una vez tengas los datos necesarios, puedes hacer uso de estos métodos:

    Descargar Imagen

    private Bitmap downloadImage(String imageHttpAddress){
    		URL imageUrl = null;
    		Bitmap loadedImage = null;
    		try{
    			
    			imageUrl = new URL(imageHttpAddress);
    			HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
    			conn.connect();
    			loadedImage = BitmapFactory.decodeStream(conn.getInputStream());
    		}catch(IOException ex){
    			ex.printStackTrace();
    		}
    		
    		return loadedImage;
    	}
    

    Guardar Imagen en SD

    private void saveImageExternalStorage(Bitmap imagen){
        	if ((mExternalStorageAvailable == true) && (mExternalStorageWritable == true)){
        		String root = Environment.getExternalStorageDirectory().toString();
        		File cfImagenes = new File(root + "/NombreDeLaCarpeta/");
        		if (cfImagenes.isDirectory() == false){
        			cfImagenes.mkdir();
        		}else{
            		String imgNombre = "NombreDeLaImagen" + ".jpg";
            		File file = new File(cfImagenes, imgNombre);
            		if (file.exists() == false){
            			try{
            				FileOutputStream out = new FileOutputStream(file);
            				imagen.compress(Bitmap.CompressFormat.JPEG, 100, out);
            				out.flush();
            				out.close();
            			}catch (IOException ex){
            				ex.printStackTrace();
            			}
            		}
            	}
        	}
        	
        }
    

    Estos métodos son los que he usado varias veces, pero al fin y al cabo el tema de bajar imágenes va en función de tu proyecto, de lo que quieras hacer, del comportamiento y el enfoque que le des, ya que si son tamaños de imágenes grandes puede que te convenga descargarlos si la conexión que existe es WiFi únicamente, para no consumir demasiados datos en caso contrario.

    Igualmente en el blog de Android que te he puesto arriba aparece algo de hacer Caché con imágenes.

    Espero que te sirva de ayuda!

    Saludos!!

  5. Hey amigo por favor he visto tutoriales en toda la web y el procedimiento es el mismo pero no me corre la aplicación me sale que la aplicacion ha sido detenida

    • Buenas Milton,

      Has consultado el Log para ver que tipo de excepción te lanza?

      Quizás se te pueda haber olvidado darle permisos para usar internet a la aplicación mediante el AndroidManifest.xml

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

      Saludos, y cualquier cosa no dudes en preguntar.

  6. Excelente tutorial, te agradezco un montón, por otra parte si quisiera que esta imagen se almacene en un directorio especifico y que la app lo tome desde ahí después, como harías?

    • Buenas Kivpson,

      Si quisieras guardar una imagen en algún directorio especial, puedes crear un directorio en la memoria interna usando la clase ContextWrapper, de la siguiente manera:

      public class MainActivity extends Activity {
      	public static final String DIRECTORIO_IMAGENES = "imagenes";
      	
      	@Override
      	protected void onCreate(Bundle savedInstanceState) {
      		super.onCreate(savedInstanceState);
      		setContentView(R.layout.activity_main);
      		
      		ContextWrapper cw = new ContextWrapper(this);
      		
      		// Obtenemos la ruta al directorio con el nombre que hemos puesto como primer
      		// argumento, y si no existe lo crea
      		File dir = cw.getDir(DIRECTORIO_IMAGENES, Context.MODE_PRIVATE);
      		
      		// Obtenemos una lista con los archivos que existen dentro e iteramos para realizar
      		// lo que queramos
      		File[] archivos = dir.listFiles();
      		for (File imagen : archivos){
      			Log.i("Archivo encontrado", imagen.getAbsolutePath());
      			Log.i("Archivo encontrado", imagen.getName());
      		}
      	}
      
      }
      

      De esta manera, puedes obtener el directorio y trabajar con el como quieras.

      Por otro lado, si lo que quieres es guardar la ruta para acceder a ella directamente, deberías guardar la ruta de los archivos bien en las preferencias o mediante una base de datos.

      Espero que te sea de ayuda!

      Saludos!!

    • Buenas Freddy

      Lo primero de todo me alegro de que te haya sido de utilidad y gracias por comentar.

      Por otro lado, si lo que quieres es mostrar varios «Imageviews» como si fuera una parrilla de imágenes, la mejor implementación seria usar un «GridView», los cuales se pueden llenar con una clase que herede de «BaseAdapter» para cargar cada elemento con una imagen.

      Tenia pensado hace tiempo sacar una entrada enseñando esto mismo, pero por unas cosas u otras no he podido. Intentare hacer uno este fin de semana sobre este tipo de implementación y si aun sigues con la duda te puede ayudar.

      De igual modo, busca mas información sobre esto que te comento porque creo que es lo que estas buscando.

      Espero que te sea de ayuda.

      Saludos!!

  7. Disculpa ya has usado websockets desde android tienes alguna libreria. Estoy intentando conectarme con esta libreria Java-WebSocket a mi servidor el archivo es .ashx con javascript me conecto correctamente. desde android se cierra lo conexion inmediatamente se crea el objeto. Gracias.

    • Buenas Ronald

      Personalmente no he tenido oportunidad de usar sockets entre Android y un servidor, por lo que me temo que no puedo ayudarte con este tema, lo siento.

      Saludos, y espero que lo soluciones!

  8. Hola mira yo he descargado una imagen, desde un web services el tema es que cuando lo descargo y lo coloco en el Imageview y el usuario me gira la pantalla vuelve a llamar a la tarea asíncrona, estuve leyendo y la verdad utilizan este texto agregándolo al manifest «android:configChanges=”keyboardHidden|orientation” pero no es lo más óptimo, sabes como descargar la imagen, y que al girar la pantalla el activity no pase su ciclo de nuevo y vuelva a llamar la tarea asíncrona.

    Cualquier ayuda se agradece, saludos

    • Buenas Felipe,

      Podrías incluir algún tipo de sistema de cache para ello, algo como comprobar si existe ya una imagen guardada en el dispositivo (alguna carpeta o algo) basándote en la url de la imágen por ejemplo, de manera que en la tarea asíncrona compruebes si existe en caché, de esta manera la tarea asíncrona se ejecutará, pero en vez de descargarla, la cogerá de la caché. En el caso contrario, de que la imagen no hubiera sido bajada previamente, pues se ejecutaría la descarga.

      Hay maneras mejores, pero esto puede guiarte un poco.

      Saludos y espero que te sea de ayuda.

Deja un comentario