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

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

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

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

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

1 ответ

Решение

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);

Надеюсь, что это полезно!

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

Другие вопросы по тегам