DownloadManager не удается загрузить на внешнее хранилище на Samsung с пирогом - PullRequest
8 голосов
/ 09 апреля 2019

Не удается загрузить файл с помощью Android DownloadManager во внешнее хранилище на Samsung Galaxy S9, S9 + на Android 9 (Pie).

Загрузка работает для устройств Samsung с Android 8 или других устройств с Android 9 (например,Пиксель 2)

Я добавил к манифесту следующие разрешения:

 "android.permission.WRITE_EXTERNAL_STORAGE", 
 "android.permission.READ_EXTERNAL_STORAGE",
 "android.permission.INTERNET"

Я также запросил разрешения READ / WRITE_EXTERNAL_STORAGE во время выполнения.

Путь к файлу:/storage/4295-DDD5/Android/data/com.example.myapplication/files/filename.file и этот путь к файлу существует, я создал его с помощью обозревателя файлов устройств AndroidStudio

Метод, который создает загрузку:

public void downloadFile(String url, String filePath) {
   DownloadManager mDownloadManager = 
   (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);

   DownloadManager.Request request = new 
   DownloadManager.Request(Uri.parse(url));

   request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | 
   DownloadManager.Request.NETWORK_WIFI);

   request.setVisibleInDownloadsUi(true);

   request.setDestinationUri(Uri.parse("file://" + filePath));

   mDownloadManager.enqueue(request);
}

Ожидаемый результат - загрузка указанногоВместо этого я получаю следующие ошибки в журналах:

D/DownloadManager: [8616] Starting com.example.myapplication
W/DownloadManager: [8616] Stop requested with status FILE_ERROR: Failed to generate filename: java.io.IOException: Permission denied
D/DownloadManager: [8616] Finished with status WAITING_TO_RETRY
V/DownloadManager: MIME Type = application/octet-stream
I/DownloadManager: Download 8616 finished with status WAITING_TO_RETRY
I/DownloadManager: Notification Clear Download 1:com.example.myapplication

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Оагар, что помогло мне в прошлом, так это чтение всех 8 постов в блоге «Смерть внешнего хранилища» от https://commonsware.com/blog/archive.html

Я думаю, что коренная причина кроется в этом:

Путь к файлу: /storage/4295-DDD5/Android/data/com.example.myapplication/files/filename.file и этот путь к файлу существует, я создал его с помощью обозревателя файлов устройств AndroidStudio

То, что вы создали этот каталог и видите, не означает, что ваше приложение может записывать в него. Поэтому попробуйте написать куда-нибудь, где вы точно знаете, что можете писать файлы.

Надеюсь, это поможет вам.

0 голосов
/ 22 мая 2019

Мне удалось заставить его работать с помощью setDestinationInExternalFilesDir (с нулем в качестве второго параметра).

При этом файл должен храниться точно в том же месте, что и запрошенный, однако реальная реализация работает на устройствах Samsung. Также я не прошу никакого разрешения (*_EXTERNAL_STORAGE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...