AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?

Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?

Ein Thema von philipp.hofmann · begonnen am 25. Feb 2021 · letzter Beitrag vom 19. Mär 2021
Antwort Antwort
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
842 Beiträge
 
Delphi 10.4 Sydney
 
#1

Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?

  Alt 25. Feb 2021, 16:06
Hi,

bis Android 10 suche ich folgendermaßen nach dem möglichen Pfaden für die SD-Karte (oder USB-Sticks):

Delphi-Quellcode:
procedure searchForExternalDevice(deviceNr: byte);
var possibleList: TStringPairList;
  searchForDir: String;
  i: Integer;
  dirExists: Boolean;
  dirList: TStringDynArray;
begin
  possibleList:=TStringPairList.create(True);
  if (TOSVersion.Major<11) then
    TFileUtils.listSDUSB();
  try
    dirList:=TDirectory.GetDirectories('/storage', TSearchOption.soTopDirectoryOnly, nil);
    for i:=0 to length(dirList) - 1 do
    begin
      if (MatchesMask(dirList[i], '/storage/????-????')) then
      begin
        possibleList.add(TStringPair.create(dirList[i] + '/Android/data/', 'com.icTrainer/files/'));
        possibleList.add(TStringPair.create(dirList[i] + '/icTrainer/', ''));
      end;
    end;
  except
    on E: Exception do
      log.d('Can´t access /storage: ' + E.message);
  end;
  try
    dirList:=TDirectory.GetDirectories('/mnt/media_rw', TSearchOption.soTopDirectoryOnly, nil);
    for i:=0 to length(dirList) - 1 do
    begin
      if (MatchesMask(dirList[i], '/mnt/media_rw/????-????')) then
        possibleList.add(TStringPair.create(dirList[i] + '/icTrainer/', ''));
    end;
  except
    on E: Exception do
      log.d('Can´t access /mnt/media_rw: ' + E.message);
  end;
  possibleList.add(TStringPair.create('/storage/sdcard1/Android/data/', 'AppName/files/'));
  possibleList.add(TStringPair.create('/storage/usbotg/AppName/', ''));
  possibleList.add(TStringPair.create('/storage/sdcard1/AppName/', ''));
  possibleList.add(TStringPair.create('/storage/usbdisk/AppName/', ''));
  possibleList.add(TStringPair.create('/mnt/media_rw/AppName/', ''));

  for i:=0 to possibleList.count - 1 do
  begin
    searchForDir:=possibleList[i].val1 + possibleList[i].val2;
    if ((externalDevice1 = searchForDir) or (externalDevice2 = searchForDir)) then
      continue;
    dirExists:=DirectoryExists(possibleList[i].val1);
    log.d('Search for ' + possibleList[i].val1 + ' ' + TStringUtils.BoolToStr(dirExists));
    if (dirExists) then
    begin
     //und hier mache ich jetzt was mit dem Pfad
      exit;
    end;
  end;
end;

class procedure TFileUtils.listSDUSB();
begin
    jfMntPath := TJFile.JavaClass.init( StringToJString( '/storage' ) );
    if jfMntPath.isDirectory and jfMntPath.exists then begin
      nSDK_Level := TJBuild_VERSION.JavaClass.SDK_INT;
      if nSDK_Level >= 19 then
      begin
        sMediaMounted := JStringToString( TJEnvironment.JavaClass.MEDIA_MOUNTED );
        jfList := jfMntPath.listFiles;
        for i := 0 to jfList.Length-1 do
        begin
          // getStorageState is added in API level 19; deprecated in API level 21, which introduces getExternalStorageState(File). Delphi interface does not supports this method with parameter.
          sPathStorageState := JStringToString( TJEnvironment.JavaClass.getStorageState( jfList.Items[i] ) );
          if SameText( sPathStorageState, sMediaMounted ) then
            mlog.info('External(1)(1): '+JStringToString(jfList.Items[i].getPath))
          else
            mlog.info('External(1)(2): '+JStringToString(jfList.Items[i].getPath));
        end;
      end;
    end;
    mlog.info('External(2): '+JStringToString(TJEnvironment.JavaClass.getExternalStorageDirectory.getPath));
end;
Mit Android-11 geht dies nicht mehr, man hat aber Zugriff auf den Pfad der eigenen App (z.B. /storage/???/Android/data/AppName/files/). Dies weiß ich, weil ich auf einem Device mit Android-10 den Pfad ermittelt hatte, danach ein Update auf Android-11 durchgeführt habe und weiterhin Zugriff auf meine Files hatte.

Nur wie ermittelt man den Pfad von USB-Sticks oder SD-Karten auf einem Android-11-Device?
Es reicht mir aus, darin auch nur auf den Pfad der eigenen App zugreifen zu können.

Grüße, Philipp
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.772 Beiträge
 
Delphi 12 Athens
 
#2

AW: Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?

  Alt 25. Feb 2021, 17:11
Wenn du nur den App eigenen Pfad zum Ablegen von Dateien suchst, dann nimm doch TPath.GetXXXX.
Weiß gerade nicht welche, aber eine dieser Get Funktionen liefert das richtige Verzeichnis und
das geht auch unter Android 11.
  Mit Zitat antworten Zitat
michaelg

Registriert seit: 20. Apr 2008
87 Beiträge
 
#3

AW: Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?

  Alt 25. Feb 2021, 17:23
Guck mal hier: http://cc.embarcadero.com/Item/30158

Das scheinen Helperfunktionen zu sein, und da gibt es:

Code:
function GetExternalStorageDirectory: string;
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
842 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?

  Alt 26. Feb 2021, 09:44
TPath.get... gibt meines Wissens unter Android nur App-Pfade unterhalb von
Code:
   /storage/emulated/0/Android/data/<application ID>/files
bzw.
Code:
   /data/data/<application ID>/files
zurück. Ich wüsste leider nicht, wie ich damit an den Pfad für die SD-Karte oder auch USB-Stick herankomme.

Code:
GetExternalStorageDirectory
hört sich total passend an, ist aber seit Anfang 2015 nicht mehr weitergepflegt worden, d.h. steht auf einem Stand Android 5.x und basiert daher auch auf der Tatsache, dass zu dem Zeitpunkt, man noch freien Zugriff im Dateisystem hatte (d.h. kein Sandbox-Prinzip). D.h. die Methode GetExternalSDCardDirectory liefert zwar unter Android 10 das gewünschte Ergebnis zurück (so wie in meiner bisherigen Implementierung auch), unter Android 11 funktioniert der Mechanismus aber nicht mehr, sondern bleibt dort hängen. Und es geht ja genau darum, wie man den Pfad trotz eingeführtem Sandbox-Prinzip ermittelt.
  Mit Zitat antworten Zitat
swestner

Registriert seit: 31. Aug 2012
Ort: Hallstadt
74 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?

  Alt 19. Mär 2021, 00:17
Hallo,

wir verwenden die gleiche Routine

class procedure TFileUtils.listSDUSB();
begin
jfMntPath := TJFile.JavaClass.init( StringToJString( '/storage' ) );
if jfMntPath.isDirectory and jfMntPath.exists then begin
nSDK_Level := TJBuild_VERSION.JavaClass.SDK_INT;
if nSDK_Level >= 19 then
begin
sMediaMounted := JStringToString( TJEnvironment.JavaClass.MEDIA_MOUNTED );
jfList := jfMntPath.listFiles;

aber

jfMntPath.listFiles;

liefert bei mir unter Android 11 immer NIL zurück.

Dann stürtzt die App in der For-Schleife mit External Exception 36 ab.

Hat da irgendjemand eine Idee?
Stefan Westner
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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