Я долго боролся с этой проблемой ... Я обновляю приложение, которое использует DownloadManger для выполнения простой задачи, такой как загрузка файла в общедоступный каталог внешнего хранилища, то есть:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
Здесь все отлично работает с Android api 19-28. Проблемы возникают при тестировании на API 29 (Q / 10). В Android реализовано ограниченное хранилище, поэтому getExternalStoragePublicDirectory устарел ... В результате мне нужно найти совместимое решение для поддержки API 19- 29. Я не могу использовать внутреннее хранилище приложения, так как DownloadManager вызовет исключение SecurityException. В документации Android указано, что я могу использовать DownloadManager.Request setDestinationUri
, и даже упоминается для Android Q, что я могу использовать Context.getExternalFilesDir(String)
. Когда я это делаю, путь по-прежнему остается эмулированным путем:
/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml
Я получаю ответ от диспетчера загрузок о том, что загрузка завершена (с правильным идентификатором), но затем я не могу получить загрузку из области, в которой я ее сохранил. Я проверяю, существует ли файл, и он возвращает false:
new File("/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml").exists();
Любая помощь приветствуется
Добавление кода для контекста. Итак, настройка менеджера загрузок
private void startDownload() {
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
registerReceiver(downloadReceiver, filter);
String remoteURL= getString(R.string.remote_url);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(remoteUrl));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
request.setTitle(getString(R.string.download_title));
request.setDescription(getString(R.string.download_description));
request.setDestinationUri(Uri.fromFile(new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml")));
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
mainDownloadID= manager.enqueue(request);
}
проверка файла, если он существует:
new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml").exists(); //this returns false in the onReceive (and download IDs match)