PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Conservation de fichiers entre deux installations ; je réve où pas !
Conservation de fichiers entre deux installations ; je réve où pas !
Débuté par Pascal BOULESTEIX, 26 juin 2021 09:00 - 23 réponses
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 26 juin 2021 - 09:00
Bonjour à tous
Je suis de ceux qui souhaitent pouvoir conserver des fichiers entre deux installations.
Avec Android 11, il semblerait que ce ne soit plus possible (du moins c'est ce que j'ai lu dans divers articles PCSoft, une autorisation spéciale devant être demandée android.permission.MANAGE_EXTERNAL_STORAGE).

Mais le test suivant, sur mon samsung G10 android 11 me laisse dubitatif mais plein d'espoir !

1 - sur mon téléphone, j'ai ajouté récemment une carte SD afin de voir si l'on pouvait créer/conserver des fichiers d'une installation à l'autre.

2 - Avec un petit projet WM26, j'en suis arrivé au fait que ce code

nNumFichier = fOuvre (SysRepStockageExterne ( 2 , ssePublicDocument )+[fSep()]+"BXDatas"+[fSep()]+"BXSQL7.sql", foCréationSiInexistant)

SI nNumFichier <> -1 ALORS
// Lecture de la ligne
fEcritLigne(nNumFichier,DateSys)
fFerme(nNumFichier)
FIN


crée bien le dossier BXDatas et le fichier BXSQL7.sql sur la carte SD et qu'en cas de désinstallation du projet, le dossier et le fichier ne sont pas supprimés :merci:

3 - Devant ce succès, j'ai essayé de créer le même dossier et le même fichier dans la mémoire du téléphone

nNumFichier = fOuvre (SysRepStockageExterne ( 1 , ssePublicDocument )+[fSep()]+"BXDatas"+[fSep()]+"BXSQL7.sql", foCréationSiInexistant)

SI nNumFichier <> -1 ALORS
// Lecture de la ligne
fEcritLigne(nNumFichier,DateSys)
fFerme(nNumFichier)
FIN


et les fichiers sont conservés après la désinstallation !

Qu'en pensez-vous ? Y a-t-il un loup ? Une installation depuis le play store différerait-elle ?
Membre enregistré
3 334 messages
Popularité : +93 (137 votes)
Posté le 26 juin 2021 - 13:05
D'accord, c'est faisable mais quizz de la publication de l'application sur Google play ?
Pour aider le schmilblic voici un lien in French
https://support.google.com/googleplay/android-developer/answer/10467955…
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 26 juin 2021 - 13:58
Dans mon mini projet je n'ai pas demandé MANAGE_EXTERNAL_STORAGE !
Membre enregistré
3 334 messages
Popularité : +93 (137 votes)
Posté le 26 juin 2021 - 15:42
Et tu as fait cela sur quelle version Android ?
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 26 juin 2021 - 19:58
WL26 mais c'est plus vicieux qu'il n'y parait.

1 - l'application N°1
1.1 - crée le dossier
1.2 - crée le fichier
1.3 - écrit un timestamp dans le fichier

2 - L'application N°2 veut faire la même chose, dans le même dossier/fichier : EACCES (Permission denied)

3 - Si je supprime l'application N°1
3.1 - Si je redéploie l'application N°1 depuis WM26
3.2 - ca fonctionne avec le dossier/fichier créés à l'étape 1

Dommage, mais il en demeure pas moins que les fichiers dans le dossier Documents sont plus faciles à trouver que dans l’arborescence des dossiers de l'application ; utile pour que les utilisateurs puissent transmettre l'ensemble des fichiers pour un debug.

Fin :(
Membre enregistré
3 334 messages
Popularité : +93 (137 votes)
Posté le 26 juin 2021 - 21:31
Dans l'aide, il est écrit
dans les répertoires publics, une application ne peut accéder (en lecture ou en écriture) qu'aux fichiers qu'elle a elle-même créés.
Donc, ton 2 est normal
Posté le 28 juin 2021 - 16:58
>> utile pour que les utilisateurs puissent transmettre l'ensemble des fichiers pour un debug.

Si c'est juste ca le problème, perso, je fais une simple fonction debug qui fait un zip des fichiers de la base et les envoie au support (par email, http ou ftp)

Ca marche dans tous les cas, l'utilisateur à juste à appuyer sur un bouton, et c'est tout simple à faire... et si je veux protéger la fonction, un simple code à usage unique fait le boulot
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 29 juin 2021 - 10:10
Le problème n'est pas de faciliter le debug mais bien de conserver les fichiers d'une installation à une autre
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 29 juin 2021 - 10:10
Bonjour Pascal,

Le plus simple avec des applications mobiles, c'est de n'utiliser aucun fichier indispensable en local!
Je l'ai conseillé il y a un certain temps...
Tes paramètres, tu les installes sur le serveur et tu les récupères après avoir identifié ton matériel, par un Webservice SOAP par exemple.
Plus d'autorisations ANDROID, des applications qui échangent des données...

--
Cordialement F. SCHAAL
HFSQL® Speed Test, Webservice Stats (suivi de toute l'activité numérique et économique), Webservice Ask/Secure (Login/Password), Webservice IA-PASS (Intelligence Artificielle-Cloud), Guides Webdev®: https://intra.fr
Posté le 29 juin 2021 - 10:29
Bonjour,

Votre conseil ne vaut QUE lorsque l'utilisateur a une connexion internet fiable!

Si l'application est une application Outdoor cela se complique grandement!

Dans ce cas là les données en local sont inévitables!

De plus certaines applications gratuites (ou pas d'ailleurs) ont des contraintes budgétaires ou autres qui font que la gestion et l’administration d'un serveur n'est pas possible!

Et dans ces cs là la protection des données est primordiale, on peut prévoir des sauvegardes mais si par exemple l'utilisateur désinstalle l'application il faut pouvoir conserver les données pour une réinstallation.

Jusqu'à Android 11 aucun problème , mais avec Android 11 cela pose un sérieux problème!
Posté le 29 juin 2021 - 12:21
> Votre conseil ne vaut QUE lorsque l'utilisateur a une connexion internet fiable!

Non... il suffit de l'avoir une fois de temps en temps et de répliquer les données. J'utilise WXReplication pour ca et ca fonctionne très bien même quand la connexion est pourrie la plupart du temps.

Si l'application est une application Outdoor cela se complique grandement!

Dans ce cas là les données en local sont inévitables!

Oui, en local, mais pas SEULEMENT, d'ou la réplication

> De plus certaines applications gratuites (ou pas d'ailleurs) ont des contraintes budgétaires ou autres qui font que la gestion et l’administration d'un serveur n'est pas possible!

60€ par an pour un serveur webdev de base qui suffit largement pour la réplication et rien à administrer vu que le loueur le fait... Je ne connais aucune appli qui ne peut pas se permettre ca.

Et dans ces cs là la protection des données est primordiale, on peut prévoir des sauvegardes mais si par exemple l'utilisateur désinstalle l'application il faut pouvoir conserver les données pour une réinstallation.

Il suffit de ré-enroller le téléphone et c'est magique, les données réapparaissent.

> Jusqu'à Android 11 aucun problème , mais avec Android 11 cela pose un sérieux problème!

La réplication fonctionne quelle que soit la version, sert de sauvegarde en même temps, et permet de partager les données avec un autre téléphone tablette ou même windows/web.
Posté le 29 juin 2021 - 15:16
J'ai essayer de télécharger le code source WXReplication sur le site de l'auteur mais le fichier est corrompu.

Avez vous un lien pour télécharger le fichier afin de réaliser des essais?

Merci par avance
Posté le 29 juin 2021 - 16:19
en l'occurrence, il ne l'est pas...

Je me souvenais vaguement d'un gag comme ca et du coup j'ai vérifié...

Le système ZIP de windows ne sait pas ouvrir le fichier, mais un vrai utilitaire de zippage (chez moi 7zip) l'ouvre sans problème...

Donc, même si je te l'envoie, tu auras le même problème si tu essaye de l'ouvrir avec l'explorateur de fichiers
Posté le 29 juin 2021 - 17:39
En effet désolé,

Je vais jeter un œil

Quelle solution vous utilisez au niveau serveur ?
Posté le 29 juin 2021 - 19:33
je ne comprend pas vraiment la question...
WXReplication utilise une page awp en tant que webservice REST avec du transport type http, donc n'importe quel serveur webdev peut faire le boulot
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 30 juin 2021 - 09:00
Cezame a écrit :
Bonjour,

Votre conseil ne vaut QUE lorsque l'utilisateur a une connexion internet fiable!

Si l'application est une application Outdoor cela se complique grandement!

Dans ce cas là les données en local sont inévitables!


Point de vue! Une variable globale chaine fera à mon avis aussi l'affaire. Il faudrait juste tester si le contenu de la chaine globale est conservé quand l'appli passe en arrière plan . Quand on se connecte à Internet, on exploite la chaine, envoie les données et on vide la chaine.
Evidemment si la chaine fait des tonnes de données, il faut passer en fichier local.

--
Cordialement
François
Posté le 30 juin 2021 - 10:07
François SCHAAL a écrit :
Cezame a écrit :
Bonjour,

Votre conseil ne vaut QUE lorsque l'utilisateur a une connexion internet fiable!

Si l'application est une application Outdoor cela se complique grandement!

Dans ce cas là les données en local sont inévitables!

Point de vue! Une variable globale chaine fera à mon avis aussi l'affaire. Il faudrait juste tester si le contenu de la chaine globale est conservé quand l'appli passe en arrière plan . Quand on se connecte à Internet, on exploite la chaine, envoie les données et on vide la chaine.
Évidemment si la chaine fait des tonnes de données, il faut passer en fichier local.

--
Cordialement
François


Tout n'est pas aussi simple... Ce n'est pas la connexion est disponible ou pas!

En outdoor la connexion peut évoluer rapidement d'une seconde à l'autre et donc la base de données inaccessible d'une seconde à l'autre!
La base de données locale est inévitable.
Si par exemple vous souhaitez faire un relevé de tracé GPS précis et un enregistrement de photos de waypoints... il est inconcevable de la faire avec une connexion internet intermittente sous peine d'avoir de nombreux soucis.
On ne peut pas appliquer les méthodes utilisées avec une connexion stable dans ces cas là!
Vous dites "quand in se connecte à internet"... Problème on est pas sur un raisonnement binaire, ce qui est vrai à l'instant T n'est peut être plus valable à l'instant T + 1 seconde!
Sans non plus parler de la qualité de la connexion, on ne peut pas faire en Edge ce qu'on pourrait faire en 4G ou 5G.
Merci pour votre aide.
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 30 juin 2021 - 15:54
C'est simple (pour moi)
Si je veux transférer une chaine de 5000 caractères de données, je la passe en paramètres à un WS. Un autre paramètre est la taille de la chaine et éventuellement des clés de contrôle liées au contenu de la chaine. C'est lu et exploité par le WS : le retour m'indique OK sinon j'envoie tout cela ultérieurement avec des nouvelles données.
Ici je n'ai jamais parlé de me connecter à une base de données depuis l'appli :)
Et une position GPS c'est quoi, 50 octets au maximum !

--
Cordialement F. SCHAAL
HFSQL® Speed Test, Webservice Stats (suivi de toute l'activité numérique et économique), Webservice Ask/Secure (Login/Password), Webservice IA-PASS (Intelligence Artificielle-Cloud), Guides Webdev®: https://intra.fr
Posté le 30 juin 2021 - 16:25
Une photo en résolution correcte on est a combien?
Quand on a une BDD de plusieurs centaines de Mo en Edge ça donne quoi?
Je travaille avec des WS pour les positions GPS mais j'ai une base de données locale pour bien d'autres fonctionnalités qui justement ne sont pas gérable par ces méthodes en outdoor, d’où l'intérêt de pouvoir conserver ses fichiers en cas de réinstallation par exemple.
Chaque application est un cas unique...
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 01 juillet 2021 - 08:09
Salut à tous
Je reviens dans le cercle des réponses après quelques jours de déconnexion.
1 - Mon application doit pouvoir travailler hors-ligne.
2 - Mon application sert à faire de la saisie sur le terrain.
3 - Pouvoir faire une sauvegarde de la base et l'envoyer via FTP sur un site de sauvegarde quand on est en liaison : facile !
4 - Proposer à l'utilisateur de restaurer sa base à partir de FTP une fois une mise à jour installée : facile !
5 - Imposer cette gymnastique intellectuelle à l'utilisateur : très difficile !
Ce qui est dommage, c'est que lors de la désinstallation/mise à jour sans désinstallation, un processus ne puisse être lancé dans l'application, processus dans lequel on pourrait proposer à l'utilisateur la cinématique sauvegarde/restauration.
Posté le 01 juillet 2021 - 10:26
Pascal BOULESTEIX a écrit :
Salut à tous
Je reviens dans le cercle des réponses après quelques jours de déconnexion.
1 - Mon application doit pouvoir travailler hors-ligne.
2 - Mon application sert à faire de la saisie sur le terrain.
3 - Pouvoir faire une sauvegarde de la base et l'envoyer via FTP sur un site de sauvegarde quand on est en liaison : facile !
4 - Proposer à l'utilisateur de restaurer sa base à partir de FTP une fois une mise à jour installée : facile !
5 - Imposer cette gymnastique intellectuelle à l'utilisateur : très difficile !
Ce qui est dommage, c'est que lors de la désinstallation/mise à jour sans désinstallation, un processus ne puisse être lancé dans l'application, processus dans lequel on pourrait proposer à l'utilisateur la cinématique sauvegarde/restauration.




On est exactement dans la même problématique, le fait de mettre les données dans un répertoire autre permettait de préserver les données et les rendre plus facilement accessible.
Travailler en lige est inenvisageable du fait de la qualité de connexion.
Envisager une sauvegarde / restauration ou réplication avec une connexion instable est très difficile si les données sont importantes.
Il est également vrai qu'imposer ce genre de choses à l'utilisateur final n'est pas toujours facile, il faut rendre automatique les processus.
Membre enregistré
3 334 messages
Popularité : +93 (137 votes)
Posté le 01 juillet 2021 - 13:01
Je n'ai pas d'appareil Android 11 pour tester
Mais si l'application garde le même nom de package et avec le code de Pascal
Cela devrait fonctionner.
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 01 juillet 2021 - 20:10
Je vais publier une mise à jour la semaine prochaine.
J'ajouterai un bout de code espion.
A suivre.
Pascal
Membre enregistré
964 messages
Popularité : +16 (20 votes)
Posté le 08 août 2021 - 18:32
Bonjour à tous
Çà y est, je suis en mesure de donner un peu d'espoir !

Je viens de publier des versions internes de mon application.

J'ai ajouté une fonction d'écriture dans un fichier partagé :

<Compile SI TypeConfiguration=Android>
Res est une chaîne = AppliListeVersion()
IV est un InfoVersion

AfficheInfo est une chaîne = [
Numéro = %1
Date = %2
Taille = %3 octets
Commentaire = %4
]


srep1 est une chaîne = SysRepStockageExterne ( 1 , ssePublicDocument )+[fSep()]+"fr.saxrub.visiolittoralBX"

SI fRépertoireExiste(srep1) = Vrai ALORS
Info ("Le répertoire inter-versions existe", "",srep1)
SINON


fRepCrée(srep1)

SI ErreurDétectée ALORS
Info(ErreurInfo(errComplet))
SINON
Info ("Le répertoire inter-versions vient d'être créé","",srep1)
FIN
FIN

nNF3 est un entier = fOuvre (srep1+[fSep()]+"BX.txt", foCréationSiInexistant+foAjout+foLectureEcriture)

SI nNF3 <> -1 ALORS
// Lecture de la ligne
fEcritLigne(nNF3,DateHeureSys)
POUR TOUTE chaîne MaChaîne de Res SEPAREE PAR RC
IV = AppliInfoVersion(MaChaîne)
fEcritLigne(nNF3,ChaîneConstruit(AfficheInfo, IV.NuméroVersion, IV.Date, IV.Taille, IV.Commentaire))
fEcritLigne(nNF3,"===============================================")
FIN

fFerme(nNF3)
FIN

<FIN>


BILAN !

- Lors d'une installation (l'application n'est pas déjà présente sur le téléphone), une nouvelle base est créée, le fichier partagé est créé et un enregistrement y est ajouté.
- Si, après la publication d'une nouvelle version, on procède depuis le play strore à une mise à jour (le bouton est 'Mettre à jour'), la base existante et le fichier partagé restent en l'état et sont utilisables.
- Si, l'on désinstalle la version installée et qu'on installe ma nouvelle version depuis le play store (le bouton est 'Installer'), la base est récréée, le fichier partagé est détecté MAIS il est impossible d'y écrire.

Moralité : faire des mises à jours semble garantir le maintient des fichiers et des droits mais le tout est bien fragile.