Как хранить файлы, созданные из приложения, в папке "Загрузки" 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);
    }