Загрузите файл данных 5-40 МБ в Android 2.2 от URL. Какие классы использовать для разработки?
-
28-10-2019 - |
Вопрос
Я разрабатываю приложение, в котором мне нужно загрузить файл (.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);
Надеюсь, это полезно!
РЕДАКТИРОВАТЬ: Я исправляю этот пример, чтобы удалить ненужную двойную нагрузку для тех, кто приходит на это позже.