Каков наилучший способ загрузить большой файл во внутреннюю память, который ведет себя как запрос DownloadManager?

В настоящее время я использую DownloadManager для загрузки CSV-файла ~ 20 МБ во внешнее хранилище через мое приложение, для которого требуется разрешение Write_External. Я хотел бы иметь возможность загрузить этот CSV-файл во внутреннее хранилище моего приложения (поэтому мне не нужно требовать этого разрешения и гарантировать, что внутреннее хранилище всегда доступно), однако DownloadManager не может сделать это/получить доступ к хранилищу моего приложения.

Я знаю, что для этого можно использовать AsyncTask или службу загрузки, но мне нравится, как ведет себя DownloadManager в том смысле, что:

  • загрузка запускается автоматически, когда пользователь восстанавливает подключение к Интернету после запуска в автономном режиме
  • он автоматически обрабатывает приостановку, возобновление и повторную попытку загрузки

Могу ли я добиться этого с помощью AsyncTask, Service или даже сторонней библиотеки?


person Adam Short    schedule 04.09.2016    source источник
comment
однако DownloadManager не может сделать это / получить доступ к хранилищу моего приложения - это может быть с FileProvider, хотя я еще не пробовал это.   -  person CommonsWare    schedule 05.09.2016
comment
@CommonsWare согласно комментарию здесь FileProvider не будет работать: поскольку DownloadManager использует схему file:// для доступа к файлу и FileProvider предоставит вам схему URI в виде содержимого: //   -  person Adam Short    schedule 05.09.2016
comment
Ну фрак. Я отправил запрос на функцию, чтобы решить эту проблему. Для загрузки размером 20 МБ не используйте AsyncTask, так как загрузка может занять некоторое время. IntentService будет хорошим выбором, пока вы активно скачиваете. Однако я не уверен, есть ли какие-либо клиентские библиотеки HTTP, которые упрощают паузу/возобновление/повторную попытку. Управление подключением, вероятно, лучше всего осуществляется через JobScheduler.   -  person CommonsWare    schedule 05.09.2016
comment
Я бы предпочел, чтобы DownloadManager сделал эту работу, а затем переместил файл туда, где он вам нужен.   -  person Rediska    schedule 05.09.2016
comment
@Rediska, но разве для этого все еще не требуется разрешение на запись?   -  person Adam Short    schedule 05.09.2016