Android:如何在android下载文件?

我正在尝试从URL下载文件。 我有以下代码。

package com.example.downloadfile; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.widget.TextView; import android.widget.Toast; public class DownloadFile extends Activity { private static String fileName = "al.jpg"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = new TextView(this); tv.setText("This is download file program... "); try { //this is the file you want to download from the remote server String path ="http://www.fullissue.com/wp-content/uploads/2010/12/Adam-Lambert.jpg"; //this is the name of the local file you will create String targetFileName = "al.jpg"; boolean eof = false; URL u = new URL(path); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); String PATH_op = Environment.getExternalStorageDirectory() + "/download/" + targetFileName; tv.append("\nPath > " + PATH_op); FileOutputStream f = new FileOutputStream(new File(PATH_op)); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ( (len1 = in.read(buffer)) > 0 ) { f.write(buffer,0, len1); } f.close(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); } tv.append("\nAnother append!"); this.setContentView(tv); } } 

有人能告诉我这段代码有什么问题。 我无法看到我应该下载的文件。 我是java和android dev的新手,非常感谢任何帮助。 🙂

  1. 您正在主应用程序线程上进行网络I / O. 充其量,这将在下载过程中冻结您的UI。 在最坏的情况下,您的活动将因“应用程序无响应”(ANR)对话框而崩溃。

  2. 您正在尝试写入可能不存在的外部存储上的目录( download/ )。 请先创建目录。

  3. 请考虑切换到使用Log.e()进行错误记录,因为我不知道printStackTrace()适用于Android。

此外,请确保您具有WRITE_EXTERNAL_STORAGE权限,并且您在Eclipse中使用adb logcat ,DDMS或DDMS透视图来检查LogCat并查找您尝试记录的错误消息。

首先,您应该向AndroidManifest.xml添加权限:

     

其次,添加此代码,以便如果该文件夹不存在,它将检查并创建该文件夹:

 File root = android.os.Environment.getExternalStorageDirectory(); File dir = new File (root.getAbsolutePath() + "/download"); if(!dir.exists()) { dir.mkdirs(); } 

第三,正如Commons Ware所说,在主线上​​下载并不是一个好习惯; 你应该在新的线程上实现它; 因为在下载时,主线程忙于下载文件。 如果等待时间超过预期,系统将生成“无响应”错误。

为此,您可以使用“ TaskAsync ”或“ IntentService ”甚至创建新线程。

如你所说,你是java的新手,我建议使用“ TaskAsync ”,因为它非常简单易用。

lib将帮助你

https://github.com/AriaLyy/Aria

下载文件只有一个代码

 Aria.download(this) .load(DOWNLOAD_URL) .setDownloadPath(DOWNLOAD_PATH) //file save path .add(); 

得到下载状态

 @Download.onPre(DOWNLOAD_URL) protected void onPre(DownloadTask task) {} @Download.onTaskStart void taskStart(DownloadTask task) {} @Download.onTaskRunning protected void running(DownloadTask task) {} @Download.onTaskResume void taskResume(DownloadTask task) {} @Download.onTaskStop void taskStop(DownloadTask task) {} @Download.onTaskCancel void taskCancel(DownloadTask task) {} @Download.onTaskFail void taskFail(DownloadTask task) {} @Download.onTaskComplete void taskComplete(DownloadTask task) {} @Download.onNoSupportBreakPoint public void onNoSupportBreakPoint(DownloadTask task) {}