【问题标题】:Android: How to download file in android?Android:如何在 android 中下载文件?
【发布时间】:2011-08-18 09:57:35
【问题描述】:

我正在尝试从 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的新手,非常感谢您的帮助。 :)

【问题讨论】:

  • 嘿,看看这个:anddev.org/novice-tutorials-f8/… 免费源代码,用于下载和图像并在它发生时显示加载微调器:-)。但是您想下载到文件,所以这是评论而不是答案
  • @Blundell:感谢 tut 链接,这很有趣。但是是的,我想下载一个文件而不仅仅是图像:)

标签: java android file url download


【解决方案1】:
  1. 您正在主应用程序线程上执行网络 I/O。充其量,这将在下载进行时冻结您的 UI。在最坏的情况下,您的 Activity 会因“应用程序无响应”(ANR) 对话框而崩溃。

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

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

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

【讨论】:

  • 感谢您的回复。 1.我只是想先尝试下载一个文件。 2.download/目录已经存在。我还在我的 AndroidManifest.xml 3 上添加了 WRITE_EXTERNAL_STORAGE 权限。有没有其他方法可以得到错误,我正在做的是,我复制 apk 文件然后将其传输并安装到我的平板电脑上。
  • 你应该用 ADB 将你的平板电脑连接到 Eclipse,这样你就可以在 DDMS 透视图中获取你的堆栈跟踪,并通过混乱的复制 apk 立即部署
【解决方案2】:

首先,您应该向 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 所说,在主线程上下载并不是一个好习惯;你应该在一个新线程上实现它;因为在下载时,主线程正忙于下载文件。如果等待时间超过预期,系统将产生“未响应”错误。

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

正如您所说,您是 java 新手,我建议使用“TaskAsync”,因为它非常简单明了。

【讨论】:

    【解决方案3】:

    这个库会帮助你

    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) {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2017-11-11
      • 2015-07-21
      相关资源
      最近更新 更多