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