Скачать файл данных 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);
Надеюсь, что это полезно!
РЕДАКТИРОВАТЬ: я исправляю этот пример, чтобы удалить ненужный двойной поток для тех, кто сталкивается с этим позже.