2011-03-29 19 views
10

¿Alguien sabe cómo guardar un archivo de un servidor web (host local) en la tarjeta sd a través de wifi?Cómo guardar el archivo del sitio web a la tarjeta SD

Estoy haciendo el análisis xml a mi aplicación y para eso tengo que descargar un archivo xml de localhost a la tarjeta sd y luego etiquetar el análisis sintáctico. Estoy atascado con la descarga de un archivo xml a la tarjeta SD. Por favor, guíame sobre cómo hacer esto ..

Respuesta

42

Puede utilizar este método para descargar un archivo de Internet a la tarjeta SD:

public void DownloadFromUrl(String DownloadUrl, String fileName) { 

    try { 
      File root = android.os.Environment.getExternalStorageDirectory();    

      File dir = new File (root.getAbsolutePath() + "/xmls"); 
      if(dir.exists()==false) { 
       dir.mkdirs(); 
      } 

      URL url = new URL(DownloadUrl); //you can write here any link 
      File file = new File(dir, fileName); 

      long startTime = System.currentTimeMillis(); 
      Log.d("DownloadManager", "download begining"); 
      Log.d("DownloadManager", "download url:" + url); 
      Log.d("DownloadManager", "downloaded file name:" + fileName); 

      /* Open a connection to that URL. */ 
      URLConnection ucon = url.openConnection(); 

      /* 
      * Define InputStreams to read from the URLConnection. 
      */ 
      InputStream is = ucon.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 

      /* 
      * Read bytes to the Buffer until there is nothing more to read(-1). 
      */ 
      ByteArrayBuffer baf = new ByteArrayBuffer(5000); 
      int current = 0; 
      while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
      } 


      /* Convert the Bytes read to a String. */ 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(baf.toByteArray()); 
      fos.flush(); 
      fos.close(); 
      Log.d("DownloadManager", "download ready in" + ((System.currentTimeMillis() - startTime)/1000) + " sec"); 

    } catch (IOException e) { 
     Log.d("DownloadManager", "Error: " + e); 
    } 

} 

es necesario agregar los siguientes permisos a su AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
+0

Esta es realmente una gran respuesta ... una pregunta más, ¿sabe cómo almacenar el archivo en modo invisible. (es decir) el archivo de almacenamiento nunca será visible para el usuario. – RAAAAM

+0

Lo siento, no tengo ni idea de eso. Tal vez [esta publicación ayudará] (http://stackoverflow.com/questions/1129644/how-to-make-a-file-hidden-in-android-sd-card) – Sourav

+0

@HariRam: es posible que desee poner o llama a este método en un 'AsyncTask o en un nuevo' Thread. De esta forma, el proceso de descarga queda oculto para el usuario. –

0

Prefiero construir un servidor de jabón y realizar una llamada desde la aplicación al servidor y recibir XML. O tal vez podrías crear una URL que genere XML y que simplemente analice la URL directamente.

tratar de leer más sobre esto LINK

suerte tengo responder a la pregunta. De lo contrario, estaría encantado de ayudar, pero necesito una descripción más detallada de la funcionalidad.

+0

Gracias, mi problema es que quiero guardar el archivo XML que está residiendo desde mi servidor host local en una tarjeta SD. Solo para ahorrar. – RAAAAM

+0

Oye, para hacer eso, sugiero que solo hagas un script de descarga de PHP estático ([link] (http://www.ryboe.com/tutorials/php-headers-force-download)) y que simplemente lo descargues de una URL Haga su teléfono donde establece una ruta a la tarjeta SD ... –

1

El Sourav de la respuesta es correcta, pero para archivos de gran tamaño, debe implementarla en un nuevo hilo; porque durante la descarga, el hilo principal está ocupado para descargar el archivo. Si el tiempo de espera es más de lo esperado, el sistema generará el error "No responde".

Con el fin de hacer que puede utilizar "TaskAsync" o "IntentService"

Cuestiones relacionadas