![]() |
Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?
Hi,
bis Android 10 suche ich folgendermaßen nach dem möglichen Pfaden für die SD-Karte (oder USB-Sticks):
Delphi-Quellcode:
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.
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; 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 |
AW: Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?
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. |
AW: Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?
Guck mal hier:
![]() Das scheinen Helperfunktionen zu sein, und da gibt es:
Code:
function GetExternalStorageDirectory: string;
|
AW: Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?
TPath.get... gibt meines Wissens unter Android nur App-Pfade unterhalb von
Code:
bzw.
/storage/emulated/0/Android/data/<application ID>/files
Code:
zurück. Ich wüsste leider nicht, wie ich damit an den Pfad für die SD-Karte oder auch USB-Stick herankomme.
/data/data/<application ID>/files
Code:
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.
GetExternalStorageDirectory
|
AW: Delphi 10.4.2 und Android 11: Wie finde ich den Pfad für die SD-Karte heraus?
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 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