German Problem mit runtime_permission

peternmb

Well-Known Member
Licensed User
Longtime User
Hallo,

kann mir vielleicht jemand helfen und sagen, warum dieser Code unter Android-10 die App zum Absturz bringt?
Ich finde keinen Fehler und unter älteren Android-Versionen funktioniert es auch.
B4X:
    Dim rp As RuntimePermissions
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, istOK As Boolean)
    If istOK Then
        'access here
        'Msgbox2Async("Zugriff OK", "Ich", "", "OK", "", Null, False)
        'Wait For Msgbox_Result (Result As Int)
        ListDir = File.DirRootExternal & "/MeinVerzeichnis "
        File.MakeDir(File.DirRootExternal,"MeinVerzeichnis ")
        'ListDir = rp.GetSafeDirDefaultExternal("MeinVerzeichnis ")
    Else
        'no Permission
        Msgbox2Async("Wenn Sie der App keinen Zugriff gewähren, werden die Daten im internen Speicher abgelegt auf den Sie keinen Zugriff haben. Sämtliche Daten werden bei einer Deinstallation gelöscht.", "Datenspeicherung", "noch einmal fragen", "Zugriff nicht erlauben", "", Null, False)
        'Msgbox2Async("kein Zugriff", "Ich", "", "OK", "", Null, False)
        Wait For Msgbox_Result (Result As Int)
        If Result = DialogResponse.POSITIVE Then
            rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
            Wait For Activity_PermissionResult (Permission As String, istOK As Boolean)
            If istOK Then
                'access here
                ListDir = File.DirRootExternal & "/MeinVerzeichnis "
                File.MakeDir(File.DirRootExternal,"MeinVerzeichnis ")
            Else
                ListDir = File.DirInternal & "/MeinVerzeichnis "
                File.MakeDir(File.DirInternal,"MeinVerzeichnis ")
            End If
        Else
            ListDir = File.DirInternal & "/MeinVerzeichnis "
            File.MakeDir(File.DirInternal,"MeinVerzeichnis ")
            MsgboxAsync("Zum Speichern wird der interne Speicher verwendet.","Hinweis")
        End If
    End
Wenn die Erlaubnis erteilt wird, stürzt meine App ab, bei Verweigerung ist alles OK.
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Die Fehlemeldung müssen wir erraten?

Code mit File.DirRootExternal = broken code!
Du hast unter hohen Androidversionen keinen Zugriff zu diesem Pfad!

 

peternmb

Well-Known Member
Licensed User
Longtime User
Code mit File.DirRootExternal = broken code!
Du hast unter hohen Androidversionen keinen Zugriff zu diesem Pfad!

Danke, das ist dann vermutlich auch das Problem.
Was wäre die Alternative, damit er User Zugriff auf seine Daten hat?
 
D

Deleted member 103

Guest
Danke, das ist dann vermutlich auch das Problem.
Was wäre die Alternative, damit er User Zugriff auf seine Daten hat?
 

peternmb

Well-Known Member
Licensed User
Longtime User
Danke für den Link, der allerdings mein Problem nicht löst.
Ich setzte das bereits in meiner App ein, um dem Anwender die Möglichkeit zu geben eine Datei z.B. auf einen USB-Stick zu exportieren.

Ich möchte jetzt allerdings dem Anweder keine Auswahlmöglichkeit anbieten sondern einfach nur ein zugängliches Verzeichnis auf dem Gerät anlegen.
Die darin gespeicherten Daten sollen bei einer Deinstallation nicht gelöscht werden sollen.
 

peternmb

Well-Known Member
Licensed User
Longtime User
Ich habe meinen Code jetzt etwas geändert, die Rechte werden angefordert und die App läuft.
In die Manifestdatei habe das eingefügt:
B4X:
AddManifestText(<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
)

Problem: ich finde meine Daten nicht - wenn ich es richtig verstanden habe sollten diese sich im Ordner Android/Data/MeinVerzeichnis befinden.
Was mache ich denn da immer noch falsch???
B4X:
    Dim rp As RuntimePermissions
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, istOK As Boolean)
    If istOK Then
        'access here
        'Msgbox2Async("Zugriff OK", "Ich", "", "OK", "", Null, False)
      ListDir = rp.GetSafeDirDefaultExternal("MeinVerzeichnis")
    Else
        Msgbox2Async("Wenn Sie der App keinen Zugriff gewähren, werden die Daten im internen Speicher abgelegt auf den Sie keinen Zugriff haben. Sämtliche Daten werden bei einer Deinstallation gelöscht.", "Datenspeicherung", "noch einmal fragen", "Zugriff nicht erlauben", "", Null, False)
        Wait For Msgbox_Result (Result As Int)
        If Result = DialogResponse.POSITIVE Then
            rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
            Wait For Activity_PermissionResult (Permission As String, istOK As Boolean)
            If istOK Then
                'access here
                'Msgbox2Async("Zugriff OK", "Ich", "", "OK", "", Null, False)
                ListDir = rp.GetSafeDirDefaultExternal("MeinVerzeichnis")
            Else
                'Msgbox2Async("kein Zugriff", "Ich", "", "OK", "", Null, False)
                ListDir = File.DirInternal & "/MeinVerzeichnis"
                File.MakeDir(File.DirInternal,"MeinVerzeichnis")
            End If
        Else
            'Msgbox2Async("kein Zugriff", "Ich", "", "OK", "", Null, False)
            ListDir = File.DirInternal & "/MeinVerzeichnis"
            File.MakeDir(File.DirInternal,"MeinVerzeichnis")
       End If
    End If
 
D

Deleted member 103

Guest
Danke für den Link, der allerdings mein Problem nicht löst.
Du wirst auch keine andere Lösung finden, so ist es nun mal ab Android 10.
Ich bin auch über diesen Weg gegangen.
 

peternmb

Well-Known Member
Licensed User
Longtime User
Warum funktioniert mein Code nicht, lt. Beschreibung müsste das doch so gehen oder wo ist mein Denkfehler???
 
D

Deleted member 103

Guest
Es steht alles hier:
 

peternmb

Well-Known Member
Licensed User
Longtime User
Könntest du mir vielleicht konkret sagen was ich falsch mache. Wäre toll. Danke.
 
D

Deleted member 103

Guest
Könntest du mir vielleicht konkret sagen was ich falsch mache. Wäre toll. Danke.
Du kannst kein Verzeichnis unter "Android/Data/" erstellen, dass macht das System selber und das Verzeichnis heißt dann: "Android/Data/MeinPackageName/files".
Unter "Files" kannst dann auch ein neuer Verzeichnis erstellen.
Willst du aber dein Verzeichnis unter "File.DirRootExternal", dann geht es ohne die classe "ExternalStorage" nicht.
 

peternmb

Well-Known Member
Licensed User
Longtime User
Vielen Dank für die Erläuterung, bringt mir schon etawas mehr Klarheit.
Ich möchte meine Dateien im Verzeichnis "Android/Data/MeinPackageName/files" speichern.
Was hier noch von Interesse wäre: werden diese Daten bei einer Deinstallation der App gelöscht, oder bleiben die erhalten?

Mit meinem obigen Code sollte, wenn ich es richtig verstanden habe, eigentlich dieses Verzeichnis erstellt werden - wird es aber nicht, also mache ich da etwas falsch, nur was? Welche Bezeichnung hat dann diese Verzeichnis, um z.B. Dateien darin zu speichern?
 
D

Deleted member 103

Guest
Was hier noch von Interesse wäre: werden diese Daten bei einer Deinstallation der App gelöscht, oder bleiben die erhalten?
Es wird alles gelöscht, ohne aussname.

Mit meinem obigen Code sollte, wenn ich es richtig verstanden habe, eigentlich dieses Verzeichnis erstellt werden - wird es aber nicht, also mache ich da etwas falsch, nur was?
Dein Code erzeugt kein Verzeichnis,
B4X:
ListDir = rp.GetSafeDirDefaultExternal("MeinVerzeichnis")

du muss es schon selber erstellen, wenn es noch nicht gibt.
B4X:
    ListDir = Starter.rp.GetSafeDirDefaultExternal("")
    If Not(File.Exists(ListDir, "MeinVerzeichnis")) Then
        File.MakeDir(ListDir, "MeinVerzeichnis")
    End If
 

peternmb

Well-Known Member
Licensed User
Longtime User
Ich bekomme eine Fehlermeldung, die ich nicht zurodnen kann:
Fehlerbeschreibung: Unbekanntes Mitglied: rp
Fehler in Zeile: 91
listdir = starter.rp.GetSafeDirDefaultExternal("")
Word: rp
Ich habe rp doch als RuntimePermission deklariert, wieso dann die Fehlermeldung?

B4X:
Dim rp As RuntimePermissions
Dim listdir As String
'
listdir = starter.rp.GetSafeDirDefaultExternal("")
If Not(File.Exists(listdir, "MeinVerzeichnis")) Then
    File.MakeDir(listdir, "MeinVerzeichnis")
End If
'
AppDir = listdir & "/MeinVerzeichnis"
ToastMessageShow("Speicherort: " & AppDir,True)
 

peternmb

Well-Known Member
Licensed User
Longtime User
Ich habe es jetzt so gemacht:
B4X:
Dim rp As RuntimePermissions
AppDir = rp.GetSafeDirDefaultExternal("")
File.MakeDir(AppDir, "Daten")
'       
ToastMessageShow("Speicherort: " & AppDir,True)
'
Funktioniert alles ohne Problem, nur finde ich immer noch keine Daten, im Pfad "Android/Data/MeinPackageName/files".
Auf meinem geliehenen nagelneuen Testgerät Samsy TabA7 ist das Verzeichnis "Android/Data/" komplett leer.
 
D

Deleted member 103

Guest
Was ist die ausgabe von ToastMessageShow?
B4X:
ToastMessageShow("Speicherort: " & AppDir,True)

GetSafeDirDefaultExternal (SubFolder As String) As String​

Returns the path to the app's default folder on the secondary storage device.

The path to File.DirInternal will be returned if there is no secondary storage available.
It is a better alternative to File.DirDefaultExternal. On Android 4.4+ no permission is required to access this folder.
You should add this code to the manifest editor to add the permission on older versions of Android:
AddManifestText(<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
)

D.h. wenn "File.DirDefaultExternal" nicht vorhanden ist, dann gibt dir das System ein "File.DirInternal".
 
D

Deleted member 103

Guest
/storage/emulated/0/Android/data/MeineApp/files

Aber der Ordner /Android/data existiert doch auf dem Gerät, wieso wird der dann nicht verwendet???
Ich habe keine Ahnung wie du deine Daten speicherst, ich sehe hier keinen Code.
 
Top