French GetSafeDirDefaultExternal

jojo12

Member
Licensed User
Je dois passer mon programme aux nouvelles normes Android concernant les permissions.
Mais je ne sais pas quoi faire.
J'ai pris en compte la library RuntimePermissions et mis la ligne testfolder = rp.GetSafeDirDefaultExternal(Chemin).
De là, je ne sais pas comment traduire tous les (File.DirRootExternal qui se trouvent dans le code ci-dessous.

Comment articuler File.DirRootExternal avec GetSafeDirDefaultExternal ?
Sachant qu'il y a la détection d'un directory, de l'existence d'un fichier, de la lecture dans une liste et du chargement d'une image.

Le manifeste est le suivant :
AddManifestText(
<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="33
"/>

Et enfin, dernière précision, tous les fichiers sont en mode READ à partir du programme.

Merci pour vos éclairages.



B4X:
Chemin = "/Cours CD/AffichePA/"
    
    Private rp As RuntimePermissions
    Private testfolder As String
    
    testfolder = rp.GetSafeDirDefaultExternal(Chemin)
        
    If File.IsDirectory(File.DirRootExternal, Chemin & "Images") = False Then   
     
    ListFicc = File.ListFiles(File.DirRootExternal & Chemin & "Images/")
    If File.Exists(File.DirRootExternal & Chemin & "affipri.txt", "") = False Then
    afflist = File.ReadList(File.DirRootExternal, Chemin & "affipri.txt")
    ImageView1.Bitmap = LoadBitmap(File.DirRootExternal, Chemin & "Images/" & nomfic)
 

klaus

Expert
Licensed User
Longtime User
Ci-joint un petit programme test.
Par-contre, je ne sais pas si cette méthode est acceptée par Google et si oui, jusqu'à quand
Car Google restreint de plus en plus l'accès à des données.

Et le code:

B4X:
    Private RP As RuntimePermissions
    Private testfolder, Chemin As String
    
    Chemin = "/Cours CD/AffichePA/"
    testfolder = RP.GetSafeDirDefaultExternal(Chemin)
    Log(testfolder)
    
    'pour avoir au moins un ficher dans le répertoire et pour qu'il soit initialisé
    If File.Exists(testfolder, "flag_fr.png") = False Then
        File.Copy(File.DirAssets, "flag_fr.png", testfolder, "flag_fr.png")
    End If
    
    Private lstFichiers As List
    lstFichiers = File.ListFiles(testfolder)
    For i = 0 To lstFichiers.Size - 1
        Log(lstFichiers.Get(i))
    Next
    
    ImageView1.Bitmap = LoadBitmap(testfolder, lstFichiers.Get(0))

Le Log(testfolder) affiche ceci: /storage/emulated/0/Android/data/b4a.TestRPFolder/files/Cours CD/AffichePA
b4a.TestRPFolder est le nom du Package dans Build Configuration:

1707407269762.png


Et dans l'Explorateur Fichier de Windows, avec une connexion USB, le répertoire se situe dans Carte SD\Android\data\b4a.TestRPFolder\files\Cours CD\AffichePA\
Peut-être que Carte SD se nomme différemment sur ton appareil.

1707407472497.png


Et plus bas:

1707407495820.png



Tu peux y ajouter des fichiers depuis le PC avec une connexion USB.
 

Attachments

  • TestRPFolder1.zip
    9.1 KB · Views: 27

jojo12

Member
Licensed User
Merci beaucoup.
Je vais regarder tout ça de près.
Cela m'embête : " Google restreint de plus en plus l'accès à des données." car je pensais ne plus programmer et j'aurais aimé une solution pérenne, mais rien ne semble durer.
Je teste et j'aurai peut-être quelques points à éclaircir
 

jojo12

Member
Licensed User
Le programme affiche un écran blanc et se termine immédiatement.
J'aurai en début de semaine une connexion wifi pour B4-bridge/

Où mettre les fichiers qui doivent être pris lors de la compilation ?

La connexion USB vise-t-elle toujours la SD card?

Comment sont créés les fichiers qui se trouvent dans \Android\data\b4a.TestRPFolder\files\Cours CD\AffichePA\ ? Faut-il les mettre soi-même ?
 

klaus

Expert
Licensed User
Longtime User
Le programme affiche un écran blanc et se termine immédiatement.
De quel programme s'agit-il ?
Quel est le message d'erreur ?

Où mettre les fichiers qui doivent être pris lors de la compilation ?
Tous les fichiers dont le programme a besoin doivent être mis dans le répertoire Data du projet.
On peut aussi y mettre d'autres fichiers que le programme peut utiliser par la suite tel des images.
Ces fichiers sont accessibles dans le programme avec le nom de répertoire : File.DirAssets.
Ce répertoire est en lecture uniquement.
Si des fichiers doivent être modifiées et relus, il faut les transférer dans le programme dans le répertoire File.DirInternal ou rp.GetSafeDirDefaultExternal.
Ceci est obligatoire pour des bases de données.
Le répertoire File.DirInternal est privé pour le programme, donc inaccessible pour tous les autres programmes.
Le répertore rp.GetSafeDirDefaultExternal n'est pas accessible sur l'appareil par d'autres programmes, mais est accessible sur le PC avec l'Explorateur Fichiers de Windows via une connexion USB.

La connexion USB vise-t-elle toujours la SD card?
Non. C'est Google qui a défini la carte SD interne pour le répertoire rp.GetSafeDirDefaultExternal.

Comment sont créés les fichiers qui se trouvent dans \Android\data\b4a.TestRPFolder\files\Cours CD\AffichePA\ ? Faut-il les mettre soi-même ?
On peut y stocker soit des fichiers crées par le programme soit y stocker des fichiers soi même depuis le PC via l'Explorateur Fichiers de Windows et la connexion USB.
 
Last edited:

jojo12

Member
Licensed User
Merci pur la réponse. Cela m'a considérablement éclairci.
Le programme est celui que tu as fourni : Thursday 3.22 pm. Mais je vais retester avec les nouvelles info.

DirAssets arrive au niveau du b4a.TestRPFolder ou au niveau de DirAssets/Files
Autrement dit, si je teste la présence d'un fichier txt, je mets :
B4X:
If File.Exists(File.DirAssets & "affipri.txt", "") = False Then
        xui.MsgboxAsync("Fichier des phrases affipri.txt absent  --- abort","")
        ExitApplication
    End If

ou

B4X:
If File.Exists(File.DirAssets & "Files/" & "affipri.txt", "") = False Then
        xui.MsgboxAsync("Fichier des phrases affipri.txt absent  --- abort","")
        ExitApplication
    End If
 

klaus

Expert
Licensed User
Longtime User
J'ai vérifié le projet que j'avais posté dans le post#2.
Effectivement il y a une erreur et je comprends ton questionnement.
J'avais oublié de mettre le fichier flag_fr.png dans le répertoire Files.
Donc le programme se plante car il ne trouve pas ce fichier.
Toutes mes excuses.

Ci-joint la version 2, dans laquelle j'ai ajouté la creation de deux fichiers texte, l'un dans File.DirInternal et l'autre dans testfolder et leur lecture.
 

Attachments

  • TestRPFolder2.zip
    9.7 KB · Views: 29

jojo12

Member
Licensed User
OK, ça marche.
Cela me donne un exemple pour savoir où placer mes fichiers.
Juste une surprise, le programme prend en compte la tablette et non pas la carte SD.

Si j'ai bien compris le DirInternal est temporaire à l'exécution du programme.
Pour tout "write" faut-il faire une copy du fichier vers DirInternal et faire une Copy back du fichier vers Data/Files, quel que soit le fichier, y compris les fichiers Map ?

Merci
 

klaus

Expert
Licensed User
Longtime User
Si j'ai bien compris le DirInternal est temporaire à l'exécution du programme.
Non.
Le répertoire DirInternal est permanent. Il est seulement supprimé lorsqu'on supprime le programme.
Lorsque tu quittes le programme les fichiers dans DirInternal restent et sont disponibles lorsque tu redémarres le programme.
Il n'est donc pas nécessaire de copier systématiquement les fichiers depuis File.DirAssets.
Si tu regardes le code, les lignes ci-dessous montrent que le fichier flag_fr.png n'est copié que s'il n'est pas présent dans testfolder.
Le même principe s'applique aussi pour File.DirInternal.
B4X:
    If File.Exists(testfolder, "flag_fr.png") = False Then
        File.Copy(File.DirAssets, "flag_fr.png", testfolder, "flag_fr.png")
    End If
Pour tester, lorsque tu as sauvé la première fois les deux fichiers Test1.txt et Test2.txt tu peux commenter la ligne ci-dessous, sauver le programme, le quitter et le redémarrer et les deux fichiers sont reconnus et lus.
B4X:
'    WriteFiles
 
Top