2011-03-29 135 views
10

有谁知道如何通过WiFi将文件从网络服务器(本地主机)保存到SD卡?如何将文件从网站保存到SD卡

我正在做xml解析到我的应用程序,为此我必须从本地主机下载xml文件到SD卡,然后标记解析。我坚持下载一个XML文件到SD卡。请指导我如何做到这一点..

回答

42

您可以使用此方法来从互联网上下载文件到您的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); 
    } 

} 

您需要下列权限添加到您的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

这真是太棒了...还有一个问题,你知道如何以不可见模式存储文件。 (即)存储文件永远不会被用户看到。 – RAAAAM 2011-03-30 04:33:33

+0

对不起,我对此没有任何意见。也许[这篇文章会帮助](http://stackoverflow.com/questions/1129644/how-to-make-a-file-hidden-in-android-sd-card) – Sourav 2011-03-30 06:23:33

+0

@HariRam:你可能想要把或在AsyncTask或新的Thread中调用这个方法。这样,下载过程对用户是隐藏的。 – 2011-12-05 06:41:08

0

我更喜欢建立肥皂服务器,并从应用程序到服务器,并通过接收XML的调用。或者,也许你可以创建一个生成XML的URL,并直接解析URL。

尝试阅读更多关于这个LINK

希望我回答这个问题。否则会很乐意帮助,但我需要更详细的功能描述。

+0

谢谢你,我的问题是我想保存这是从我的本地主机服务器驻留到SD卡上的XML文件。只是为了保存。 – RAAAAM 2011-03-29 12:30:43

+0

嘿,要做到这一点,我建议只做一个静态PHP下载脚本([链接](http://www.ryboe.com/tutorials/php-headers-force-download)),而不是简单地从URL下载做你的手机,你设置了SD卡路径... – 2011-03-30 08:42:29

1

的Sourav的答案是可以的,但对于大文件大小,您应该在新线程上实现它;因为在下载时,主线程忙于下载文件。如果等待时间超出预期,系统将生成“无响应”错误。

为了做到这一点,你可以用“TaskAsync”或“IntentService