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

StackOverflow https://stackoverflow.com/questions/4866679

Вопрос

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

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

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

Любая помощь ценится ....

Это было полезно?

Решение

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top