German SD Karte unter Android 6

mw71

Active Member
Licensed User
Longtime User
Hallo,

mein neues "Spielzeug" ist mit Android 5 ausgeliefert worden. Also erst mal alles eingerichtet, funktionierte gut (ich konnte also wie immer in meiner App problemlos zwischen den Verzeichnissen, auch zwischen Internen Speicher und Externer SD wechseln....).
Als ich dann wieder WLan hatte ist das Update auf Android 6 gekommen. Danach kam die Abfrage wie ich die Externe SD Karte nutzen möchte. Ich habe mich entschieden diese weiter als "normale" SD Karte, also auch zum Austausch von Daten zwischen Geräten (oder wie sie es bezeichnet haben) zu nutzen.
Daraufhin hat die SD Karte den "kryptischen" Link /storage/4817-6E26 bekommen. Nach meinen Recherchen ist das bei Android 6 jetzt "normal".

Um weiterhin "sauber" auf die SD Karte und Internen Speicher zugreifen zu können gebe ich ab SDK 23 dem Nutzer jetzt noch Intern und SD-Card zur Auswahl.
Intern ist einfach über File.DirRootExternal zu ermitteln.
Für die SD Card nutze ich derzeit folgenden "Umweg":

B4X:
dim LV_File as ListView    'in Globals...

.....
If p.SdkVersion >=23 Then     'ab Android 6.0
    LV_File.AddSingleLine2("INTERN",File.DirRootExternal)
    Dim paths() As Object = GetContext.RunMethod("getExternalFilesDirs", Array(Null))
    Dim varSplit() As String = Regex.Split("/", paths(paths.Length-1))
    If varSplit.Length>=2 Then
         LV_File.AddSingleLine2("SD-Card","/" & varSplit(1) & "/" & varSplit(2))   
    Else
         LV_File.AddSingleLine2("SD-Card",paths(paths.Length-1))   
    End If
End If
......

(getExternalFilesDirs ist der bekannte Weg den man ab Android 4.4 gegangen ist um die zulässigen Pfade u ermitteln)

Die Ermittlung was nun gedrückt wurde (Lv_File_ItemClick...) ist dann auch etwas aufwändiger.

So, nun endlich zu den Fragen:
- gibt es einen einfacheren, sauberen Weg den Pfad (ROOT!) der SD Karte zu ermitteln?
- wie verhält sich das wenn man die SD Karte an das Gerät "bindet" (also Formatiert), ist der Pfad dann genau so oder anders?

Danke
 

DonManfred

Expert
Licensed User
Longtime User
gibt es einen einfacheren, sauberen Weg den Pfad (ROOT!) der SD Karte zu ermitteln?
Möglicherweise kommt hier meine erste geschriebene Lib zum Einsatz.
Storage

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim storage As env
    Dim paths As Map
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    paths = storage.Initialize
    For i = 0 To paths.Size-1
        Log(paths.GetKeyAt(i)&"="&paths.GetValueAt(i))
    Next
   
    Dim de As String = File.DirRootExternal
    Log ("DirRootExternal = "&de)
    Dim mtc As Matcher = Regex.Matcher("(/|\\)[^(/|\\)]*(/|\\)",de)
    Dim extsdcard As String = de
    If mtc.Find = True Then
        Dim mnt As String = mtc.Group(0)
       
        Log ("mount point = "& mnt)
        Dim dirs As List = File.ListFiles(mnt)
        For Each f As String In dirs
            If storage.isExternalStorageRemovable(mnt&f) Then
                Log ("Device = "& f&":"&mnt&f&" is removable")
                If File.ListFiles(mnt&f).IsInitialized Then
                    Log("probably ExtSDCard: "&mnt&f)
                    extsdcard = mnt&f
                Else
                    'Log("Problem reading "&mnt&f)
                End If
            Else
                Log ("Device = "& f&":"&mnt&f&" is NOT removable")
            End If
        Next
    End If
    Log("extsdcard="&extsdcard)
    For Each f As String In File.ListFiles(extsdcard)
        Log(">"&f)
    Next
    Log(storage.ExternalStorageDirectory)
End Sub

wie verhält sich das wenn man die SD Karte an das Gerät "bindet" (also Formatiert), ist der Pfad dann genau so oder anders?
Ich bin mir da nicht sicher. Denke jedoch, das der Speicher hinter DirRootExternal erweitert wird...
 

mw71

Active Member
Licensed User
Longtime User
Hallo Manfred,

Danke! das sieht erst mal gut aus, werde ich mir näher ansehen.
Eine kurze Frage die Du evtl. schnell beantworten kannst? Die Lib braucht ja mind. Android 5, kann ich die App mit dieser Lib auch auf Android 4 (z.B.) laufen lassen, wenn ich dann nicht auf diese zugreife (SDK Version abfragen ist ja kein Problem)??

Grüße
 

mw71

Active Member
Licensed User
Longtime User
hab zwischenzeitlich mal etwas getestet, so funktioniert es super, auch mit Android 4:
(ich nutze die Funktionen der Lib ja erst ab Android 6)

B4X:
If p.SdkVersion>=23 Then
    Log("===========================")
    Log("Ermittle Interne und Externe SD Card Pfade")
  
    paths_Don = storage.Initialize

    Dim de As String = File.DirRootExternal
    Dim mtc As Matcher = Regex.Matcher("(/|\\)[^(/|\\)]*(/|\\)",de)

    If mtc.Find = True Then
        Dim mnt As String = mtc.Group(0)
        Dim dirs As List = File.ListFiles(mnt)
        For Each f As String In dirs
            If File.ListFiles(mnt&f).IsInitialized Then
                ExtSDCard = mnt&f
            'Else
                'Log("Problem reading "&mnt&f)
            End If
        Next
    End If
    IntSDCard=storage.ExternalStorageDirectory
    Log("ExtSDCard=" & ExtSDCard)
    Log("IntSDCard=" & IntSDCard)
    Log("====================================")
Else
    Log("Android <6, alte Version wird in den Subs genutzt")
End If

So getestet mit Android 4.1.2, 5.1.1 und 6.0.1, geht super und der Code sieht dadurch auch wieder etwas schöner aus :)

Danke noch mal für Lib und Tipp,

Grüße
 
Top