Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android SD-Kartenzugriff (https://www.delphipraxis.net/196494-android-sd-kartenzugriff.html)

sko1 25. Mai 2018 09:15

Android SD-Kartenzugriff
 
Hallo,

seit geraumer Zeit versuche ich vergeblich, in einer Android-App das SD-Kartenverzeichnis zu finden und dort hin Dateien zu schreiben.
Mit
Delphi-Quellcode:
lList := System.IOUtils.TDirectory.GetDirectories('/storage/');

bekomme ich unter anderen auch den Pfad zur SD-Karte (auf meinem Handy in dem Fall '/storage/34AD-43FD') aber dann dort eine Datei zu speichern
Delphi-Quellcode:
fn := lList[i] + PathDelim + 'test.txt';

führt zu Fehlermeldungen.
Die App hat die Berechtigungen zum Lesen und Schreiben der SD-Karte.

Was ist hier falsch?

Ciao
Stefan

himitsu 25. Mai 2018 09:32

AW: Android SD-Kartenzugriff
 
Delphi-Referenz durchsuchenIOUtils.TPath kennst du?

Da findet sich bestimmt was.

sko1 25. Mai 2018 09:49

AW: Android SD-Kartenzugriff
 
Ja, kenne ich, hilft aber nicht weiter!

mit
Delphi-Quellcode:
lList := System.IOUtils.TDirectory.GetDirectories('/sdcard');

bekomme ich die Pfade angeblich der SD-Karte, in diese Pfade kann ich schreiben, nur wenn ich die geschriebenen Daten dann suche finde ich sie mit Eigene Dateien im Gerätespeicher (strorage/emulated/0)!

Es kann doch nicht so schwer sein, die SD-Karte zu finden, dort hinein ein Verzeichnis zu erzeugen und darin Dateien zu lesen und zu schreiben???

Ciao
Stefan

KodeZwerg 25. Mai 2018 11:30

AW: Android SD-Kartenzugriff
 
Du kannst ja mal die External storage helper functions for Android ausprobieren.

sko1 25. Mai 2018 15:31

AW: Android SD-Kartenzugriff
 
Danke für den Tip!
Folgende Testfunktion:

Delphi-Quellcode:

...uses Androidapi.IOUtilsEx;

procedure TForm1.Button3Click(Sender: TObject);
var
  dir: string;
  fn: string;
begin
  dir := GetExternalSDCardDirectory;
  showmessage(dir);
  showmessage(GetSysExternalStorage);
  if isExternalStorageWritable then
    showmessage('beschreibbar')
  else
    showmessage('readonly');
  fn := dir + PathDelim + 'test.txt';
  Memo1.Lines.LoadFromFile(fn);
  CreateDir(dir + PathDelim + 'testdir');
end;
'/storage/34AD-43FD'
'/sdcard'
'beschreibbar'
und eine dort liegende Datei test.txt kann ich lesen, habe also die SD-Karte gefunden!

Aber ich kann kein Verzeichnis erstellen: der Code läuft ohne Fehlermeldung im Debugger durch aber das Verzeichnis entsteht nicht!

Hat jemand eine Idee dazu?

Ciao
Stefan

Rollo62 25. Mai 2018 15:39

AW: Android SD-Kartenzugriff
 
Kanst du denn jetzt damit Files in bestehende Directories schreiben,
und nur noch keine neuen Directories anlegen ?

sko1 25. Mai 2018 15:58

AW: Android SD-Kartenzugriff
 
Lesen ja, schreiben nein, 'permissions denied' als Fehlermeldung.

Ich bin nahe der Verzweiflung, so ein bisschen SD-Kartenzugriff kann doch nicht so schwer sein?!

Ciao
Stefan

KodeZwerg 25. Mai 2018 16:24

AW: Android SD-Kartenzugriff
 
Soweit ich gelesen hatte sperrt Kitkat (ab v3?) schreibzugriffe weswegen ich oben die Komponente Vorschlug.
Ist ja nur 5kb groß, schau mal wie der von Emba das regelt.

timog 25. Mai 2018 21:48

AW: Android SD-Kartenzugriff
 
Ich bin mir nicht 100% sicher, aber ich meine, dass man seit Kitkat auf externen SDCards nur noch in einem Ordner Schreibrechte hat, der zur App gehört (/sdcard/<1111-1111>/Android/data/<bundle kennung>/files/Documents oder so ähnlich).
Will man mehr Schreibrechte, soll es wohl einen Umweg (Ausweg) über das Android Storage Access Framework (SAF) geben. Explorer Apps nutzen dieses Framework z.B.

sko1 26. Mai 2018 08:23

AW: Android SD-Kartenzugriff
 
Zitat:

der zur App gehört (/sdcard/<1111-1111>/Android/data/<bundle kennung>/files/Documents oder so ähnlich).
Prima, danke, ich dachte das ist jetzt die Lösung, aber leider nein!

Ich bekomme weiterhin 'permissions denied' beim Versuch zu schreiben bzw. schon beim Unterverzeichnis anlegen ForceDirectories ein False zurück!

Irgendwo ist da noch ein Trick den ich nicht durchschaut habe!

Ciao
Stefan

KodeZwerg 26. Mai 2018 09:26

AW: Android SD-Kartenzugriff
 
Das gehört zu meinem Helper Functions Link.
Zitat:

Apparently the most robust way to get access to the external storage location is through these two functions GetSysSecondaryStorage and GetSysExternalStorage.
Hier ist eine Diskussion über Permissions.
Hier in der DP gibts auch Infos zu diesem Thema!

Saving data to a file in your Android application geht da anders vor.

Zum Schreiben:
Delphi-Quellcode:
try {
   // Creates a file in the primary external storage space of the
   // current application.
   // If the file does not exists, it is created.
   File testFile = new File(this.getExternalFilesDir(null), "TestFile.txt");
   if (!testFile.exists())
       testFile.createNewFile();

   // Adds a line to the file
   BufferedWriter writer = new BufferedWriter(new FileWriter(testFile, true /*append*/));
   writer.write("This is a test file.");
   writer.close();
   // Refresh the data so it can seen when the device is plugged in a
   // computer. You may have to unplug and replug the device to see the
   // latest changes. This is not necessary if the user should not modify
   // the files.
   MediaScannerConnection.scanFile(this,
                                   new String[]{testFile.toString()},
                                   null,
                                   null);
} catch (IOException e) {
   Log.e("ReadWriteFile", "Unable to write to the TestFile.txt file.");
}
zum Lesen:
Delphi-Quellcode:
String textFromFile = "";
// Gets the file from the primary external storage space of the
// current application.
File testFile = new File(this.getExternalFilesDir(null), "TestFile.txt");
if (testFile != null) {
   StringBuilder stringBuilder = new StringBuilder();
   // Reads the data from the file
   BufferedReader reader = null;
   try {
      reader = new BufferedReader(new FileReader(testFile));
      String line;

      while ((line = reader.readLine()) != null) {
         textFromFile += line.toString();
         textFromFile += "\n";
      }
      reader.close();
   } catch (Exception e) {
      Log.e("ReadWriteFile", "Unable to read the TestFile.txt file.");
   }
}
Source Code Link davon


Klappt es damit?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz