Скачать файл данных 5-40 МБ в Android 2.2 с URL. Какие классы использовать для разработки? - PullRequest
0 голосов
/ 01 февраля 2011

Я разрабатываю приложение, в котором мне нужно загрузить файл (.zip / .txt / .jpg и т. Д.) Размером от 5 до 50 МБ. Приложение на базе Android 2.2.

Пользователь предоставляет URL и запускает загрузку, но затем процесс загрузки выполняется в фоновом режиме до завершения.

streaming должен использоваться для загрузки файла.
Я хочу знать, как это можно сделать с помощью HTTP-соединений .
какие классы могут быть использованы для этого?
Есть ли в Android 2.2 API для этого?

Любая помощь приветствуется ....

1 Ответ

9 голосов
/ 01 февраля 2011

Android действительно включал API под названием DownloadManager только для этой цели ... но он был выпущен в 2.3;так что, хотя оно не будет полезным для вашего приложения, ориентированного на 2.2, оно все же может стать хорошим ресурсом для изучения реализации.

Простая реализация, которую я бы порекомендовал, выглядит примерно так:

  • Используйте HttpURLConnection для подключения и загрузки данных.Это потребует, чтобы разрешение ИНТЕРНЕТ было объявлено в вашем манифесте
  • Определите, где вы хотите, чтобы файл был.Если вы хотите использовать его на SD-карте устройства, вам также потребуется разрешение WRITE_EXTERNAL_STORAGE.
  • Оберните эту операцию в метод doInBackground () AsyncTask.Это длительная операция, поэтому вам нужно поместить ее в фоновый поток, которым AsyncTask управляет для вас.
  • Реализуйте это в Service, чтобы операция могла выполняться защищенной без сохранения пользователемАктивность на переднем плане.
  • Используйте NotificationManager, чтобы уведомить пользователя о завершении загрузки, что отправит сообщение в его строку состояния.

Для дальнейшего упрощения, есливы используете IntentService, он будет обрабатывать потоки для вас (все, что в onHandleIntent вызывается в фоновом потоке), и вы можете поставить в очередь несколько загрузок, чтобы он обрабатывал по одной за раз, просто отправив ему несколько Intents.Вот скелетный пример того, что я говорю:

public class DownloadService extends IntentService {

public static final String EXTRA_URL = "extra_url";
public static final int NOTE_ID = 100;

public DownloadService() {
    super("DownloadService");
}

@Override
protected void onHandleIntent(Intent intent) {
    if(!intent.hasExtra(EXTRA_URL)) {
        //This Intent doesn't have anything for us
        return;
    }
    String url = intent.getStringExtra(EXTRA_URL);
    boolean result = false;
    try {
        URL url = new URL(params[0]);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        //Input stream from the connection
        InputStream in = new BufferedInputStream(connection.getInputStream());
        //Output stream to a file in your application's private space
        FileOutputStream out = openFileOutput("filename", Activity.MODE_PRIVATE);

        //Read and write the stream data here

        result = true;
    } catch (Exception e) {
        e.printStackTrace();
    }

    //Post a notification once complete
    NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    Notification note;
    if(result) {
        note = new Notification(0, "Download Complete", System.currentTimeMillis());
    } else {
        note = new Notification(0, "Download Failed", System.currentTimeMillis());
    }
    manager.notify(NOTE_ID, note);

}
}

Затем вы можете позвонить в эту службу с URL-адресом, который вы хотите скачать в любом месте действия, например:

Intent intent = new Intent(this, DownloadService.class);
intent.putExtra(DownloadService.EXTRA_URL,"http://your.url.here");
startService(intent);

Надеждаэто полезно!

РЕДАКТИРОВАТЬ: Я исправляю этот пример, чтобы удалить ненужный двойной поток для тех, кто сталкивается с этим позже.

...