Как хранить файлы, созданные из приложения, в папке "Загрузки" Android?
Я создаю excelheet в своем приложении, которое при сгенерировании должно автоматически сохраняться в папке "Загрузки" любого устройства Android, где обычно сохраняются все загрузки.
У меня есть следующее, которое сохраняет файл в папке "Мои файлы" -
File file = new File(context.getExternalFilesDir(null), fileName);
в результате чего -
W/FileUtils﹕ Writing file/storage/emulated/0/Android/data/com.mobileapp/files/temp.xls
Я скорее хочу сохранить сгенерированный файл автоматически в папке "Загрузки" при создании листа excel.
Обновление # 1: См. снимок здесь. Я хочу, чтобы тот, который был красным, и то, что вы предложили, хранится в одном кружке синего (/storage/emulated/0/download), если это имеет смысл. Пожалуйста, сообщите, как я могу сохранить файл в одной красной красной, то есть папке "Загрузки" , которая отличается от/storage/emulated/0/Загрузить в разделе "MyFiles"
![snapshot]()
Ответы
Ответ 1
Используйте это, чтобы получить каталог:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
И не забудьте установить это разрешение в своем manifest.xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Ответ 2
Теперь из вашего вопроса редактируйте, я думаю, лучше понимаю, чего вы хотите.
Файлы, отображаемые в меню "Загрузки" от одного из красных краев, это те, которые фактически загружаются через DownloadManager
, хотя предыдущие шаги, которые я вам предоставил, будут сохранять файлы в папке с загрузкой, но они не будут отображаться в этом меню, t скачано. Однако, чтобы выполнить эту работу, вы должны начать загрузку своего файла, чтобы он мог показать здесь.
Вот пример того, как вы можете начать загрузку:
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "fileName");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // to notify when download is complete
request.allowScanningByMediaScanner();// if you want to be available from media players
DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
manager.enqueue(request);
Этот метод используется для загрузки из Uri, и я не использовал его с локальным файлом.
Если ваш файл не из Интернета, вы можете попробовать сохранить временную копию и получить Uri файла для этого значения.
Ответ 3
Просто используйте DownloadManager для загрузки созданного файла следующим образом:
File dir = new File("//sdcard//Download//");
File file = new File(dir, fileName);
DownloadManager downloadManager = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE);
downloadManager.addCompletedDownload(file.getName(), file.getName(), true, "text/plain",file.getAbsolutePath(),file.length(),true);
"text/plain"
- это тип mime, который вы передаете, чтобы он знал, какие приложения могут запускать загруженный файл. Это сделало это для меня.
Ответ 4
Я использовал следующий код, чтобы заставить его работать в моем проекте Xamarin Droid с помощью С#:
// Suppose this is your local file
var file = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
var fileName = "myFile.pdf";
// Determine where to save your file
var downloadDirectory = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads);
var filePath = Path.Combine(downloadDirectory, fileName);
// Create and save your file to the Android device
var streamWriter = File.Create(filePath);
streamWriter.Close();
File.WriteAllBytes(filePath, file);
// Notify the user about the completed "download"
var downloadManager = DownloadManager.FromContext(Android.App.Application.Context);
downloadManager.AddCompletedDownload(fileName, "myDescription", true, "application/pdf", filePath, File.ReadAllBytes(filePath).Length, true);
Теперь ваш локальный файл "загружается" на ваше Android-устройство, пользователь получает уведомление, а ссылка на файл добавляется в папку загрузки. Однако убедитесь, что пользователь попросил разрешения до того, как вы напишете в файловую систему, иначе будет выбрано исключение "access denied".
Ответ 5
Как Oluwatumbi правильно ответили на этот вопрос, но сначала вам нужно проверить, разрешено ли разрешение для WRITE_EXTERNAL_STORAGE
следующим кодом:
int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
// Request for permission
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
}else{
Uri uri = Uri.parse(yourUrl);
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "fileName");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // to notify when download is complete
request.allowScanningByMediaScanner();// if you want to be available from media players
DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
manager.enqueue(request);
}