Wie speichere ich von der App generierte Dateien im Ordner “Downloads” von Android?

Lesezeit: 6 Minuten

Benutzer-Avatar
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);

ergebend –

W/FileUtils﹕ Writing file/storage/emulated/0/Android/data/com.mobileapp/files/temp.xls

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.

Schnappschuss

Benutzer-Avatar
Oluwatumbi

Verwenden Sie dies, um das Verzeichnis zu erhalten:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

Und vergessen Sie nicht, diese Berechtigung in Ihrer manifest.xml festzulegen:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  • 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

Benutzer-Avatar
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

Benutzer-Avatar
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.

Benutzer-Avatar
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

Benutzer-Avatar
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;
            }
        }

1013860cookie-checkWie speichere ich von der App generierte Dateien im Ordner “Downloads” von Android?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy