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开发的新手,非常感谢您的帮助。:)
  1. 您正在主应用程序线程上执行网络I/O。在最好的情况下,这将在下载过程中冻结您的UI。在最坏的情况下,你的活动将崩溃与"应用程序不响应"(ANR)对话框。

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

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

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

首先,你应该添加权限到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>
其次,添加以下代码,这样如果文件夹不存在,它就会检查并创建文件夹:
File root = android.os.Environment.getExternalStorageDirectory();               
           File dir = new File (root.getAbsolutePath() + "/download");
           if(!dir.exists()) {
                dir.mkdirs();
           }

第三,正如Commons Ware所说,在主线程上下载不是一个好的做法;你应该在一个新线程中实现它;因为在下载时,主线程忙于下载文件。如果等待时间超过预期,系统将产生"Not responding"错误。

为了做到这一点,你可以使用"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) {}

相关内容

  • 没有找到相关文章

最新更新