Перейти к содержанию
Fire Monkey от А до Я

Использование Android DownloadManager


Рекомендуемые сообщения

Здравствуйте! Хочу поделиться своим опытом в использовании класса android.app.DownloadManager из Android API.

Понятно из названия, что этот класс предоставляет пользователю возможность скачивать и сохранять файлы из интернета. Конечно, можно использовать HTTPClient, но по моему мнению использование DownloadManager гораздо легче.

Возможности, предоставляемые классом:

1.Скачивание любого файла из интернета с последующим сохранением

2.Вывод уведомления о процессе загрузки с настраиваемым названием и описанием

3.Разрешение загрузки только через конкретный вид сети, через роуминг, когда девайс заряжается и т.д.

Вот ссылки на официальную документацию по классу DownloadManager и его подклассу DownloadManager.Request: https://developer.android.com/reference/android/app/DownloadManager

https://developer.android.com/reference/android/app/DownloadManager.Request

Демо-проект и обёртку для класса и прикрепил внизу.

В примере по нажатию на кнопку происходит загрузка картинки в директорию /storage/emulated/0/Pictures

-----------------------------------------------------------------------------

Для начала, необходимо подключить библиотеки, необходимые приложению для работы:

uses
  androidapi.JNI.JavaTypes, androidapi.Helpers,
  androidapi.JNI.GraphicsContentViewText,
  android.app.DownloadManager, androidapi.JNI.Net, System.Permissions, Androidapi.JNI.Os;

Теперь нужно запросить у пользователя разрешение на запись в хранилище:

procedure TForm1.FormCreate(Sender: TObject);
var
  WRITE_EXTERNAL_STORAGE:String;
begin
  WRITE_EXTERNAL_STORAGE:=JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);

  PermissionsService.DefaultService.RequestPermissions([WRITE_EXTERNAL_STORAGE],
  procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
  begin
   if (Length(AGrantResults)=1) and (AGrantResults[0]=TPermissionStatus.Granted) then
   ShowMessage('Permission granted!')
   else
   begin
     Showmessage('Permission Denied! Manually go to "Settings-Applications-Project1-Permissions" and set Storage permission!');
     Application.Terminate;
   end;
  end )
end;

Если разрешение получено, то появится сообщение "Permission granted!", если нет, то программа попросит пользователя перейти в настройки и установить разрешение вручную.

Отлично, разрешение получено, теперь можно написать и саму процедуру загрузки файла.

procedure Download(code: string); //процедура будет получать уникальный код картинки на сайте pixabay.com
var
  DownloadManager: JDownloadManager;          //Объект класса DownloadManager для загрузки файла
  DownloadRequest: JDownloadManager_Request;  //Объект класса DownloadManager_Request для установки настроек загрузки
  link: JString;                              //Переменная для хранения ссылки
  URI, URIPath: JNet_URI;         //В URI будем получать ссылку на картинку, в URIPath - путь к загруженной картинке в файловой системе 
  DownloadPermission: JObject;                //Объект для получения доступа к сервису загрузки
begin
  link := StringToJString('https://pixabay.com/get/' + code + '_1280.jpg');  //получаем ссылку на картинку

  URI := TJNet_URI.JavaClass.parse(link);                                                                //заносим ссылку в URI
  URIPath := TJNet_URI.JavaClass.parse(StringToJString('file:///storage/emulated/0/Pictures/img.jpg'));  //заносим путь в URIPath


  DownloadRequest := TJDownloadManager_Request.JavaClass.init(URI);  //инициализируем DownloadRequest с ссылкой на файл
  DownloadRequest.setDestinationUri(URIPath);                        //Устанавливаем конечный путь в DownloadRequest 

  DownloadPermission := SharedActivityContext.getSystemService       //Получаем доступ к сервису загрузки
    (TJContext.JavaClass.DOWNLOAD_SERVICE);

  DownloadManager := TJDownloadManager.Wrap(DownloadPermission);     //Даём доступ к сервису загрузки DownloadManager'у
  DownloadManager.enqueue(DownloadRequest);                          //Запускаем загрузку
end;

Вот и всё, осталось только процедура нажатия на кнопку

procedure TForm1.Button1Click(Sender: TObject);
begin
 Download('g1e06713e4c5d9a9c5356f9e481ca8c37a7800ff986743fe4364aef699782e22b6a41f794dfd54ed32783eb0a577dc21b4dd2ba8fd83b6722740285291263d718');
end;

Теперь можно компилировать программу и проверить, работает-ли она. Если всё сработало, то в директории Pictures должен появиться файл "img.jpg", содержащий в себе изображение тюльпанов.

Надеюсь, это Вам поможет, если у Вас будут проблемы с загрузкой файлов. Удачи в проектах!

File Downloading.7z

Изменено пользователем PowerOwl
Исправление с комментариями в коде
Ссылка на комментарий

Я сейчас заметил, что демо-проект почему-то перестал скачивать, но если заменить ссылку(или код), то всё снова начинает работать. Если перейти в браузере по ссылке по умолчанию, то ошибка "The URL is invalid or expired"

Изменено пользователем PowerOwl
Уточнение
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...