PowerOwl Опубликовано 2 июля, 2021 Поделиться Опубликовано 2 июля, 2021 (изменено) Здравствуйте! Хочу поделиться своим опытом в использовании класса 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 Изменено 3 июля, 2021 пользователем PowerOwl Исправление с комментариями в коде Ingalime 1 Цитата Ссылка на комментарий
PowerOwl Опубликовано 3 июля, 2021 Автор Поделиться Опубликовано 3 июля, 2021 (изменено) Я сейчас заметил, что демо-проект почему-то перестал скачивать, но если заменить ссылку(или код), то всё снова начинает работать. Если перейти в браузере по ссылке по умолчанию, то ошибка "The URL is invalid or expired" Изменено 3 июля, 2021 пользователем PowerOwl Уточнение Цитата Ссылка на комментарий
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.