
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.


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"/>
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.

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.

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()
}
}

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);
}
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