![]() |
Textdatei auf Android auslesen
Hallo!
Wahrscheinlich ist meine Frage trivial, aber ich bekomme es trotzdem nicht hin. Ich versuche eine Textdatei auf dem Android Tablet (Android 13) mit textfile / readln auszulesen. Die Datei liegt im Ordner Documents. Ich bekomme den E/A Fehler 13 zurück gemeldet.
Delphi-Quellcode:
procedure TFrmGA3.PanLoadClick(Sender: TObject);
var tndatnam, zeile1, zeile2, zw1, zw2 : string; tndat : textfile; i : integer; begin tndatnam := '/storage/emulated/0/documents/tnliste.txt' assignfile(tndat,tndatnam); reset(tndat); readln(tndat,zeile1); closefile(tndat); end; Wie mache ich das? Vielen Dank! Grüße Christian (Deplhi 12) |
AW: Textdatei auf Android auslesen
Ich weiß nur das man um eine Datei aus der Sandbox der App heraus zu bekommen Ein Fileprovider geschrieben/Konfiguriert/benutzt werden muss.
Ich kann mir vorstellen, dass für den umgekehrten weg: Eine Datei in die Sandbox der App hinein bekommen, ein ähnlicher mechanismus genutzt weren muss.. "FileReceiver" oder so Der dann quasi die App als empfänger für einen bestimmten MIME context in Android registriert. Jetzt mal so ins blaue geraten... Vieleicht helfen dir die Stichworte bei der suche. |
AW: Textdatei auf Android auslesen
Bei der Entwicklung für mobile Geräte empfehle ich grundsätzlich die Nutzung der Methoden aus System.IOUtils.TPath für alles, was irgendwie mit Pfaden zu tun hat, anstatt sich die Pfade manuell zusammenzubauen, da Letzteres sehr fehleranfällig ist.
In deinem Fall würde ich also "/storage/emulated/0/documents" durch "TPath.GetSharedDocumentsPath" ersetzen und das ganze mit dem Dateinamen per "TPath.Combine" verbinden. Also quasi so:
Delphi-Quellcode:
tndatnam := TPath.Combine(TPath.GetSharedDocumentsPath, 'tnliste.txt');
Wenn die Datei wirklich unter diesem Pfad liegt (FileExists(tndatnam)?), sollte das auf diese Weise eigentlich funktionieren. Nachtrag: Fast vergessen: Die Berechtigung für den Zugriff auf den externen Speicher sitzt? Ich glaube, die braucht man dafür. Nachtrag2: Gerade nochmal nachgeschaut: Für den Zugriff auf den eigenen Ordner im externen Speicher sollte die Berechtigung tatsächlich NICHT notwendig sein. |
AW: Textdatei auf Android auslesen
Vielen Dank für die schnellen Antworten!
ich habe die Zeile übernommen (angepasst):
Delphi-Quellcode:
tndatnam := TPath.Combine(TPath.GetSharedDocumentsPath, '/tnliste.txt');
Der Fehler bleibt aber bestehen. |
AW: Textdatei auf Android auslesen
Zitat:
Danach versuch bitte mal ein FileExists auf "tndatnam", einfach um sicherzugehen, dass die Datei auch gefunden wird. Wenn es mit korrektem Pfad immer noch nicht funktioniert, würde ich vermutlich mal mir die Berechtigungen anschauen: Ich habe seit Ewigkeiten in meinen Apps nicht mehr den externen Speicher angesprochen, von daher weiß ich leider nicht mehr genau, wie es da mit den Berechtigungen aussieht, aber es gibt zwei Berechtigungen dafür, die man unter Projekt -> Optionen -> Anwedung -> Berechtigungen findet. Genauer gesagt gibt es bei den "gefährlichen" Berechtigungen "Externen Speicher lesen" und "Externen Speicher schreiben". Es ist möglich, dass in deinem Fall die Berechtigung für das Lesen des externen Speichers notwendig ist, ich bin mir aber wie gesagt nicht mehr sicher. Sollte die Berechtigung notwendig sein, müsstest du dir mal anschauen, wie man zur Laufzeit abgefragte Berechtigungen setzt. Ich bin mir ebenfalls gerade nicht sicher, ob das Anhaken bei dieser Berechtigung in den Projektoptionen ausreicht, oder ob man mit PermissionsService.RequestPermissions arbeiten muss. |
AW: Textdatei auf Android auslesen
Das Zauberwort heißt SAF.
Ohne größere Schwierigkeiten kann die App nur Dateien aus /Android/media/[App-Name]/ lesen. Ich lasse die Dateien im Explorer auswählen und kopiere sie dann dorthin. |
AW: Textdatei auf Android auslesen
Zitat:
für den sharedDocumentsPath braucht es kein StorageAccessFramework. Der sharedDocumentsPath ist ja genau dafür gedacht. hier kannst du sowohl alle Dateien die andere APPs hier rein legen lesen als auch deine Dateien für andere APPs sichtbar ablegen. siehe: ![]() Man muss zwar keine Benutzerrechte Abfragen (Zur Laufzeit die Erlaubnis einholen) aber man braucht auf jeden Fall den Zugriff auf den externen Speicher. Siehe: ![]() Zitat:
Ansonsten wäre die Prüfung auf Existenz der Datei nicht schlecht ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz