German Ordner in eigene Dateien erstellen

Bluray

Member
Hallo zusammen,

da es seit Android 10 oder 11 ja nicht mehr mit den Bordmitteln möglich ist auf Android/data zuzugreifen bzw. dieser Ordner leer ist, wollte ich meine erstellten Datenbanken nun in einen extra Ordner auf der selben Ebene wie "Download", "Music", etc. erstellen. Alternativ könnte man sie auch im App Ordner erstellen und dann in den anderen Ordner kopieren.

Der Pfad dorthin habe ich mit
B4X:
MsgboxAsync(File.DirRootExternal,"")
mir anzeigen lassen => "/storage/emulated/0".
Leider bekomme ich es nicht hin mit
B4X:
File.MakeDir(File.DirRootExternal,"Test")
dort einen Ordner zu erstellen.

Weiß da jemand einen schnellen Workaround?

MfG
 

Gubi

Member
Licensed User
Hallo Bluray,

ich habe folgenden Code verwendet:

B4X:
Dim UseFileProvider As Boolean 'TRUE = SDK >=24, make use of FileProvider; FALSE = use GetSafeDirDefaultExternal
Dim SharedFolder As String
Dim Rp As RuntimePermissions
Dim strDir = "Test" As String   
Dim p As Phone

Sub Activity_PermissionResult (Permission As String, Result As Boolean)
    If Permission = Rp.PERMISSION_WRITE_EXTERNAL_STORAGE Then
        If Result = False Then
            Rp.CheckAndRequest(Rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
        End If
    Else If Permission = Rp.PERMISSION_READ_EXTERNAL_STORAGE Then
        If Result = False Then
            Rp.CheckAndRequest(Rp.PERMISSION_READ_EXTERNAL_STORAGE)
        End If
    Else If Permission = Rp.PERMISSION_READ_PHONE_STATE Then
        If Result = False Then
            Rp.CheckAndRequest(Rp.PERMISSION_READ_PHONE_STATE)
        End If
    Else If Permission = Rp.PERMISSION_READ_CALENDAR Then
        If Result = False Then
            Rp.CheckAndRequest(Rp.PERMISSION_READ_CALENDAR)
        End If
    Else If Permission = Rp.PERMISSION_WRITE_CALENDAR Then
        If Result = False Then
            Rp.CheckAndRequest(Rp.PERMISSION_WRITE_CALENDAR)
        End If
    Else
        Log("Keine Rechte")
    End If
End Sub

Sub MakeExternalFolder
    If p.SdkVersion >= 24 Or File.ExternalWritable = False Then
        UseFileProvider = True
        SharedFolder = File.Combine(File.DirRootExternal & "/" & strDir & "/" , "shared")'File.Combine(File.DirInternal, "shared")
        File.MakeDir("", SharedFolder)
    Else
        UseFileProvider = False
        SharedFolder = Rp.GetSafeDirDefaultExternal("shared")
    End If
End Sub

Vielleicht hilft das weiter.
 

DonManfred

Expert
Licensed User
Longtime User
Vielleicht hilft das weiter.
Mit sicherheit NICHT. Code mit File.DirRootexternal = BROKEN CODE

zumindest bei targetsdk 30
 

Gubi

Member
Licensed User
Ich habe Android 11 und im Maifesteditor folgendes, damit funktioniert es (soll ja nur für einen schnellen Workaround sein):
Ich muss aber auch dazu sagen, dass ich meine App nicht in den Play Store hochlade, dafür muß ja die targetSdkVersion höher sein!

B4X:
AddManifestText(
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="24"/>
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
AddApplicationText(
  <provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="$PACKAGE$.provider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
  android:name="android.support.FILE_PROVIDER_PATHS"
  android:resource="@xml/provider_paths"/>
  </provider>
)
CreateResource(xml, provider_paths,
   <files-path name="name" path="shared" />
)

'IF YOUR APP DONT USE ANY PERMISSION YOU CAN REMOVE IT
AddPermission(android.permission.WRITE_EXTERNAL_STORAGE) ' Allows an application to write to external storage.
AddPermission(android.permission.READ_EXTERNAL_STORAGE) ' Allows an application to read from external storage.
 
Last edited:

Bluray

Member
Vielen Dank @Gubi
Der Code funktioniert. Jedoch habe ich Probleme .db also Datenbank Dateien von dem eigenen App Ordner in meinen neu erstellten Ordner zu kopieren. Einfache .txt Dateien funktionieren.
Ich habe es mit File.Copy probiert, ohne Erfolg.
FileMove von Erel hat ebenfalls nicht funktioniert.

Ich mache das über einen Button_Click Sub, in dem nur folgendes drin steht:

B4X:
rp.CheckAndRequest(rp.PERMISSION_READ_EXTERNAL_STORAGE)
rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
File.Copy(rp.GetSafeDirDefaultExternal("DB"),"1.db",File.Combine(File.DirRootExternal & "/" & strDir & "/" , "shared"),"1.db")
 

DonManfred

Expert
Licensed User
Longtime User
Ich mache das über einen Button_Click Sub, in dem nur folgendes drin steht:
Code mit File.DirRootexternal = BROKEN CODE!

Du hast keinen Zugriff auf diesen Pfad mit TargetSDK 30.


 

Gubi

Member
Licensed User
Bist du dir sicher, ob die Datei "1.db" in diesen Ordner überhaupt existiert?
Versuche erst einmal dies zu überprüfen mit:

B4X:
If File.Exists(rp.GetSafeDirDefaultExternal("DB"), "1.db") Then
    '... kopiere oder verschiebe Datei
Else
    Log("Datei nicht vorhanden")
End If
 

Bluray

Member
Bist du dir sicher, ob die Datei "1.db" in diesen Ordner überhaupt existiert?
Versuche erst einmal dies zu überprüfen mit:

B4X:
If File.Exists(rp.GetSafeDirDefaultExternal("DB"), "1.db") Then
    '... kopiere oder verschiebe Datei
Else
    Log("Datei nicht vorhanden")
End If
Ja diese existiert. Es liegt wohl irgendwie an der .db Endung, denn mit einem normalen Dateibrowser oder sogar vom Computer aus kann ich diese Datei nicht verschieben.

Nun erstelle ich die Datenbank ohne Endung, kopiere sie in mein neues Verzeichnis mit FileCopy und füge dort die .db Endung an. Von dort an kann ich damit machen was ich will.

B4X:
File.Copy(rp.GetSafeDirDefaultExternal("DB"),"1",File.Combine(File.DirRootExternal & "/" & strDir & "/" , "shared"),"1.db")
 
Top