HI I´M AN IDEA
WANNA PLAY
WITH ME?
 

Descargar archivos desde una URL en nuestra aplicación Android

Cuando empecé a programar en Android, constantemente me encontraba con procedimientos que siempre me habían parecidos rutinarios pero claro, debido a mi desconocimiento de Java, me parecían un auténtico infierno.

Hace un tiempo encontré un pequeño snippet para descargar archivos desde la web, que si modificamos según nuestras necesidades podemos explotar hasta la saciedad. He intentado comentar el código todo lo posible.

try {
	//primero especificaremos el origen de nuestro archivo a descargar utilizando
	//la ruta completa
	URL url = new URL("http://insdout.com/snippets/archivodeejemplo.txt");

	//establecemos la conexión con el destino
	HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

	//establecemos el método jet para nuestra conexión
	//el método setdooutput es necesario para este tipo de conexiones
	urlConnection.setRequestMethod("GET");
	urlConnection.setDoOutput(true);

	//por último establecemos nuestra conexión y cruzamos los dedos 😛
	urlConnection.connect();

	//vamos a establecer la ruta de destino para nuestra descarga
	//para hacerlo sencillo en este ejemplo he decidido descargar en 
	//la raíz de la tarjeta SD
	File SDCardRoot = Environment.getExternalStorageDirectory();

	//vamos a crear un objeto del tipo de fichero
	//donde descargaremos nuestro fichero, debemos darle el nombre que
	//queramos, si quisieramos hacer esto mas completo
	//cogeríamos el nombre del origen
	File file = new File(SDCardRoot,"ejemplo.txt");

	//utilizaremos un objeto del tipo fileoutputstream
	//para escribir el archivo que descargamos en el nuevo
	FileOutputStream fileOutput = new FileOutputStream(file);

	//leemos los datos desde la url
	InputStream inputStream = urlConnection.getInputStream();

	//obtendremos el tamaño del archivo y lo asociaremos a una
	//variable de tipo entero
	int totalSize = urlConnection.getContentLength();
	int downloadedSize = 0;

	//creamos un buffer y una variable para ir almacenando el 
	//tamaño temporal de este
	byte[] buffer = new byte[1024];
	int bufferLength = 0; 

	//ahora iremos recorriendo el buffer para escribir el archivo de destino
	//siempre teniendo constancia de la cantidad descargada y el total del tamaño
	//con esto podremos crear una barra de progreso
	while ( (bufferLength = inputStream.read(buffer)) > 0 ) {

		fileOutput.write(buffer, 0, bufferLength);
		downloadedSize += bufferLength;
		/podríamos utilizar una función para ir actualizando el progreso de lo 
		//descargado
		actualizaProgreso(downloadedSize, totalSize);

	}
	//cerramos
	fileOutput.close();

//y gestionamos errores
} catch (MalformedURLException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}

Hay que tener en cuenta, que para escribir en la tarjeta SD siempre debemos escribir en el manifest.

android.permission.WRITE_EXTERNAL_STORAGE

Comentarios, sugerencias, dudas? hay que darle vida a esto 😀

About the author

Jaime Mulero Hola! Me llamo Jaime Mulero, soy programador desde hace años, apasionado por la informática prácticamente desde que tengo uso de razón. Jquery Ninja, Codeigniter Trooper, database juggler and Android engineer! Jaime Mulero

VN:F [1.9.20_1166]
Rating: 6.7/10 (3 votes cast)
Descargar archivos desde una URL en nuestra aplicación Android, 6.7 out of 10 based on 3 ratings
Difunde la palabra
  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks
  • Meneame

11 Comments on "Descargar archivos desde una URL en nuestra aplicación Android"

  1. Luz dice:

    Hola, este he estado buscando este codigo por todas partes y me parece excelente lo bien explicado que esta, pero tengo un problema =(, la linea urlConnection.connect(); me genera u error, justo cuando llegua ahi truena y deja de correr la aplicacion. Podrias ayudarme con eso?? te lo agradeceria mucho =)

    VA:F [1.9.20_1166]
    Rating: 2.0/5 (1 vote cast)
    VA:F [1.9.20_1166]
    Rating: 0 (from 0 votes)
    • Jaime Mulero dice:

      Hola! podrías especificar un poco mas, que error te da?

      VN:F [1.9.20_1166]
      Rating: 0.0/5 (0 votes cast)
      VN:F [1.9.20_1166]
      Rating: 0 (from 0 votes)
      • Luz dice:

        Lo que pienso es que es a la ahora de hacer la conexion por que todo funciona perfecto hasta el momento que llega a la linea “urlConnection.connect();” y entonces es cuando truena y me manda este error:

        FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.download.image/com.download.image.DownloadActivity}: android.os.NetworkOnMainThreadException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
        at android.app.ActivityThread.access$600(ActivityThread.java:123)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4424)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        at dalvik.system.NativeStart.main(Native Method)
        04-02 10:59:09.233: E/AndroidRuntime(1313): Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
        at java.net.InetAddress.getAllByName(InetAddress.java:220)
        at libcore.net.http.HttpConnection.(HttpConnection.java:71)
        at libcore.net.http.HttpConnection.(HttpConnection.java:50)
        at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
        at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
        at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
        at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
        at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
        at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
        at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
        at libcore.net.http.HttpURLConnectionImpl.getHeaderField(HttpURLConnectionImpl.java:130)
        at java.net.URLConnection.getContentType(URLConnection.java:330)
        at com.download.image.DescargaImagen.Descargar(DescargaImagen.java:38)
        at com.download.image.DownloadActivity.onCreate(DownloadActivity.java:13)
        at android.app.Activity.performCreate(Activity.java:4465)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)

        Disculpa es largo.

        Tambien intente usando este codigo:
        http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device

        pero me da el mismo error en la linea: “InputStream is = ucon.getInputStream();”

        que esta justo de bajo de: “URLConnection ucon = url.openConnection();” y con cualquier metodo que trate de hacer un llamado a la conexion pasa lo mismo, y no se si es el url por que he probado con varios diferentes.

        Otra cosa es que yo estoy usando esto para descargar imagenes, tal vez alo tenga que ver, no se.

        espero que puedas ayudarme, gracias.

        VA:F [1.9.20_1166]
        Rating: 0.0/5 (0 votes cast)
        VA:F [1.9.20_1166]
        Rating: -1 (from 1 vote)
        • Pascual Montesinos dice:

          El problema que te da es porque en versiones posteriores a la 2.3 no está permitido realizar conexiones en el hilo principal de la aplicación. Puedes solucionarlo utilizando AsyncTask

          VA:F [1.9.20_1166]
          Rating: 5.0/5 (1 vote cast)
          VA:F [1.9.20_1166]
          Rating: 0 (from 0 votes)
  2. yhon dice:

    hola mi estimado espero que estes bien gracias por el tutorial me gusto muchisimo ,me gustaria que publicaras ome enviaras mas con respectoa creacion de aplicaciones android te lo agradeceria y una vez mas gracias por compartirlo con todos algun dia tbn complementare con algo

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: 0 (from 0 votes)
  3. Antonio dice:

    Hola muy ilustrativo el post.

    Estoy intentado descargar un archivo desde un servidor que utiliza https pero no logro hacerlo. ¿Se requiere alguna modificación adicional?.

    Saludos

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: +1 (from 1 vote)
  4. Ds1 dice:

    QUIZAS YA SEA MUY TARDE LA AYUDA PERO
    desde la version 9 se han agregado algunas politicas de seguridad es por eso el error

    dentro del try agregar lo siguiente

    if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    }

    VA:F [1.9.20_1166]
    Rating: 1.0/5 (1 vote cast)
    VA:F [1.9.20_1166]
    Rating: +1 (from 1 vote)
  5. Rodney dice:

    Hola, muchas gracias muy buen aporte

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: +1 (from 1 vote)
  6. ChinoDom dice:

    Mi, pregunta es si se puede utilizar este codigo para descargar un archivo tipo .jpeg en un Bitmap

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: 0 (from 0 votes)
  7. kcokita dice:

    Hola, una vez que descargas el archivo de una URL, como lo puedes ir actualizando ya una vez instalado y quieres agregar solo nuevos datos?

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: 0 (from 0 votes)
  8. Rodolfo dice:

    Excelente tuto, me sirvió solo me marcaba un error y no incluí la linea urlConnection.setDoOutput(true); y funcionó. Gracias por el aporte.

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: 0 (from 0 votes)

¿Algo que opinar? Deja tu comentario!