2011-11-26 21 views
11

Estoy haciendo una aplicación de biblioteca de Android que puede descargar y mostrar archivos especiales. ¡ahora necesito escribir un servicio que descargue el archivo en segundo plano! ¿hay ejemplos de servicios?cómo descargar el archivo con el servicio en segundo plano?

y quiero guardar archivos en SD, porque los usuarios pueden actualizar la aplicación y no deben perderse los archivos descargados.

Si tiene una sugerencia u opinión para esto, escríbame, por favor.

Respuesta

11
try { 
    URL url = new URL("url from apk file is to be downloaded"); 
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    urlConnection.setRequestMethod("GET"); 
    urlConnection.setDoOutput(true); 
    urlConnection.connect(); 

    File sdcard = Environment.getExternalStorageDirectory(); 
    File file = new File(sdcard, "filename.ext"); 

    FileOutputStream fileOutput = new FileOutputStream(file); 
    InputStream inputStream = urlConnection.getInputStream(); 

    byte[] buffer = new byte[1024]; 
    int bufferLength = 0; 

    while ((bufferLength = inputStream.read(buffer)) > 0) { 
     fileOutput.write(buffer, 0, bufferLength); 
    } 
    fileOutput.close(); 

} catch (MalformedURLException e) { 
     e.printStackTrace(); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 
} 

Permiso: Para escribir en almacenamiento externo, es necesario agregar este permiso:

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

Nota: puede utilizar el código anterior para obtener el archivo descargado y guardado en la tarjeta SD tarjeta. Puede ejecutar este código en segundo plano usando AsysnTask o thread.

+0

gracias por su muestra ¿Me puede dar AsysnTask muestra? – NrNazifi

+0

aquí es muy buen tutorial: http: //www.vogella.de/articles/AndroidPerformance/article.html –

6

Esta es otra muestra:

try { 
     //set the download URL, a url that points to a file on the internet 
     //this is the file to be downloaded 
     URL url = new URL("http://somewhere.com/some/webhosted/file"); 

     //create the new connection 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

     //set up some things on the connection 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.setDoOutput(true); 

     //and connect! 
     urlConnection.connect(); 

     //set the path where we want to save the file 
     //in this case, going to save it on the root directory of the 
     //sd card. 
     File SDCardRoot = Environment.getExternalStorageDirectory(); 
     //create a new file, specifying the path, and the filename 
     //which we want to save the file as. 
     File file = new File(SDCardRoot,"somefile.ext"); 

     //this will be used to write the downloaded data into the file we created 
     FileOutputStream fileOutput = new FileOutputStream(file); 

     //this will be used in reading the data from the internet 
     InputStream inputStream = urlConnection.getInputStream(); 

     //this is the total size of the file 
     int totalSize = urlConnection.getContentLength(); 
     //variable to store total downloaded bytes 
     int downloadedSize = 0; 

     //create a buffer... 
     byte[] buffer = new byte[1024]; 
     int bufferLength = 0; //used to store a temporary size of the buffer 

     //now, read through the input buffer and write the contents to the file 
     while ((bufferLength = inputStream.read(buffer)) > 0) { 
       //add the data in the buffer to the file in the file output stream (the file on the sd card 
       fileOutput.write(buffer, 0, bufferLength); 
       //add up the size so we know how much is downloaded 
       downloadedSize += bufferLength; 
       //this is where you would do something to report the prgress, like this maybe 
       updateProgress(downloadedSize, totalSize); 

     } 
     //close the output stream when done 
     fileOutput.close(); 

//catch some possible errors... 
} catch (MalformedURLException e) { 
     e.printStackTrace(); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 
+0

gracias, también su código es como una muestra de Vineet Shukla. pero los comentarios en el código son útiles para mí. – NrNazifi

+0

¿Cómo lograr este archivo de descarga en segundo plano? – Karthick

+0

puedes hacerlo en una clase que amplíe AsyncTask. –

Cuestiones relacionadas