Android: Как скачать файл в Android? - PullRequest
6 голосов
/ 04 мая 2011

Я пытаюсь загрузить файл с 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, большое спасибо за любую помощь.:)

Ответы [ 3 ]

7 голосов
/ 04 мая 2011
  1. Вы выполняете сетевой ввод-вывод в главном потоке приложения. В лучшем случае это заморозит ваш пользовательский интерфейс во время загрузки. В худшем случае ваша активность завершится с помощью диалогового окна «Приложение не отвечает» (ANR).

  2. Вы пытаетесь записать в каталог (download/) на внешнем хранилище, которое может не существовать. Пожалуйста, сначала создайте каталог.

  3. Пожалуйста, рассмотрите возможность использования Log.e() для регистрации ошибок, так как я не знаю, работает ли printStackTrace() на Android.

Также убедитесь, что у вас есть разрешение WRITE_EXTERNAL_STORAGE и что вы используете adb logcat, DDMS или перспективу DDMS в Eclipse для проверки LogCat и поиска сообщений об ошибках, которые вы пытаетесь зарегистрировать.

2 голосов
/ 08 августа 2017

библиотека поможет вам

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) {}
2 голосов
/ 03 ноября 2012

Во-первых, вы должны добавить разрешения для 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 ", так как это очень просто и просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...