Wie speichere ich von der App generierte Dateien im Ordner “Downloads” von Android?
Lesezeit: 6 Minuten
Sonnenhaut
Ich erstelle eine Excel-Tabelle in meiner App, die nach der Generierung automatisch in der gespeichert werden soll “Herunterladen” Ordner eines beliebigen Android-Geräts, in dem normalerweise alle Downloads gespeichert werden.
Ich habe Folgendes, das die Datei im Ordner “Meine Dateien” speichert –
File file = new File(context.getExternalFilesDir(null), fileName);
Ich möchte lieber die generierte Datei automatisch in der “Herunterladen” Ordner, wenn die Excel-Tabelle generiert wird.
Aktualisierung Nr. 1: Bitte sehen Sie sich den Schnappschuss hier an. Was ich möchte, ist das rot eingekreiste, und was Sie vorgeschlagen haben, wird in dem blau eingekreisten (/storage/emulated/0/download) gespeichert, wenn das sinnvoll ist. Bitte geben Sie an, wie ich eine Datei in dem einen rot eingekreisten Ordner speichern kann, dh im Ordner “Downloads”, der sich von /storage/emulated/0/Download unter “MyFiles” unterscheidet.
Oluwatumbi
Verwenden Sie dies, um das Verzeichnis zu erhalten:
Verwenden Sie einfach Folgendes: File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
– Oluwatumbi
28. Januar 2015 um 3:21 Uhr
Folgendes wird mir zurückgegeben: storage/sdcard0/Downloads, was Sie brauchen. Versuchen Sie wahrscheinlich, file.getAbsolutePath() im Verzeichnis zu toasten, bevor Sie Ihre Datei speichern. Und versuchen Sie, Ihre Frage zu bearbeiten, um zu zeigen, wie Sie die Datei speichern
– Oluwatumbi
28. Januar 2015 um 3:42 Uhr
Diese Antwort ist in API 29 veraltet
– eri0o
16. Dezember 2019 um 15:41 Uhr
Gibt es eine Alternative für getExternalStoragePublicDirectory? da es veraltet ist?
– LMK-IND
24. Dezember 2019 um 3:23 Uhr
So machen Sie es in API 29: stackoverflow.com/a/56990305/238753
– Sam
1. Februar 2020 um 7:36 Uhr
Jetzt verstehe ich aus Ihrer Fragebearbeitung besser, was Sie wollen. Dateien, die im Download-Menü ab dem rot eingekreisten angezeigt werden, sind diejenigen, die tatsächlich über heruntergeladen wurden DownloadManager, obwohl die vorherigen Schritte, die ich Ihnen gegeben habe, Dateien in Ihrem Download-Ordner speichern, aber sie werden nicht in diesem Menü angezeigt, da sie nicht heruntergeladen wurden. Damit dies funktioniert, müssen Sie jedoch einen Download Ihrer Datei initiieren, damit sie hier angezeigt werden kann.
Hier ist ein Beispiel, wie Sie einen Download starten können:
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);
Diese Methode wird zum Herunterladen von einem Uri verwendet und ich habe sie nicht mit einer lokalen Datei verwendet.
Wenn Ihre Datei nicht aus dem Internet stammt, können Sie versuchen, eine temporäre Kopie zu speichern und den Uri der Datei für diesen Wert abzurufen.
Auf API26 und höher wird der URI nicht für eine lokale Datei verwendet, ganz nett
– Becker
5. Oktober 2019 um 23:46 Uhr
Für API 28 hat diese Lösung funktioniert: stackoverflow.com/a/40748149/3248279
– Augensklave
19. Januar 2020 um 10:32 Uhr
Thiago Prochnow
Verwenden Sie einfach den DownloadManager, um Ihre generierte Datei wie folgt herunterzuladen:
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);
Das "text/plain" ist der MIME-Typ, den Sie übergeben, damit er weiß, welche Anwendungen die heruntergeladene Datei ausführen können. Das hat es für mich getan.
Was ist context?
– Brutal
7. Oktober 2021 um 15:43 Uhr
Sjoerdson
Ich habe den folgenden Code verwendet, um dies in meinem Xamarin Droid-Projekt mit C# zum Laufen zu bringen:
// 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);
Jetzt wird Ihre lokale Datei auf Ihr Android-Gerät „heruntergeladen“, der Benutzer erhält eine Benachrichtigung und ein Verweis auf die Datei wird zum Download-Ordner hinzugefügt. Stellen Sie jedoch sicher, dass Sie den Benutzer um Erlaubnis fragen, bevor Sie in das Dateisystem schreiben, da sonst eine Ausnahme „Zugriff verweigert“ ausgelöst wird.
Michail Sharin
Für API 29 und höher
Entsprechend Dokumentationmuss verwendet werden Storage Access Framework zum Other types of shareable content, including downloaded files.
Systemdateiauswahl sollte verwendet werden, um die Datei im externen Speicherverzeichnis zu speichern.
Beispiel für das Kopieren einer Datei auf einen externen Speicher:
// use system file picker Intent to select destination directory
private fun selectExternalStorageFolder(fileName: String) {
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
putExtra(Intent.EXTRA_TITLE, name)
}
startActivityForResult(intent, FILE_PICKER_REQUEST)
}
// receive Uri for selected directory
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
FILE_PICKER_REQUEST -> data?.data?.let { destinationUri ->
copyFileToExternalStorage(destinationUri)
}
}
}
// use ContentResolver to write file by Uri
private fun copyFileToExternalStorage(destination: Uri) {
val yourFile: File = ...
try {
val outputStream = contentResolver.openOutputStream(destination) ?: return
outputStream.write(yourFile.readBytes())
outputStream.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
Wenn ich versuche, die TXT-Datei auf diese Weise zu speichern, ist alles in Ordnung. Aber wenn ich versuche, eine PDF-Datei mit type = “application/pdf” und putExtra(Intent.EXTRA_TITLE, “tempFileName.pdf”) zu speichern – dann erhalte ich eine PDF-Datei, die ich nirgendwo (Smartphone, PC) öffnen kann Fehler: “Das Dokument kann nicht geöffnet werden, da es beschädigt oder beschädigt ist”. Was könnte falsch sein? @Mikhail Sharin
– Tim Kruichkov
26. Januar um 18:33 Uhr
M. Usman
Da Oluwatumbi diese Frage richtig beantwortet hat, müssen Sie jedoch zuerst prüfen, ob die Erlaubnis erteilt wird WRITE_EXTERNAL_STORAGE mit folgendem Code:
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);
}
Wenn ich versuche, die TXT-Datei auf diese Weise zu speichern, ist alles in Ordnung. Aber wenn ich versuche, eine PDF-Datei mit type = “application/pdf” und putExtra(Intent.EXTRA_TITLE, “tempFileName.pdf”) zu speichern – dann erhalte ich eine PDF-Datei, die ich nirgendwo (Smartphone, PC) öffnen kann Fehler: “Das Dokument kann nicht geöffnet werden, da es beschädigt oder beschädigt ist”. Was könnte falsch sein? @Mikhail Sharin
– Tim Kruichkov
26. Januar um 18:33 Uhr
Dies führt Code-Downloaddateien mit DownloadManager für Xamarin-Android-API-Version 29 aus
public bool DownloadFileByDownloadManager(string imageURL)
{
try
{
string file_ext = Path.GetExtension(imageURL);
string file_name = "MyschoolAttachment_" + DateTime.Now.ToString("yyyy MM dd hh mm ss").Replace(" ", "") + file_ext;
var path = global::Android.OS.Environment.DirectoryDownloads;
Android.Net.Uri uri = Android.Net.Uri.Parse(imageURL);
DownloadManager.Request request = new DownloadManager.Request(uri);
request.SetDestinationInExternalPublicDir(path, file_name);
request.SetTitle(file_name);
request.SetNotificationVisibility(DownloadVisibility.VisibleNotifyCompleted); // to notify when download is complete
// Notify the user about the completed "download"
var downloadManager = DownloadManager.FromContext(Android.App.Application.Context);
var d_id = downloadManager.Enqueue(request);
return true;
}
catch (Exception ex)
{
UserDialogs.Instance.Alert("Error in download attachment.", "Error", "OK");
System.Diagnostics.Debug.WriteLine("Error !" + ex.ToString());
return false;
}
}
10138600cookie-checkWie speichere ich von der App generierte Dateien im Ordner “Downloads” von Android?yes