samedi 15 mars 2025

App Inventor : DefaultScope des fichiers

 


Dans App Inventor, l'élément Fichier peut avoir un DefaultScope coché à App, Assets, Legacy, Private ou Shared. Que signifient ces gtermes

Dans App Inventor, l'élément Fichier dispose d'une propriété appelée DefaultScope, qui détermine où les fichiers sont lus ou écrits. Voici une explication des différentes options disponibles pour le DefaultScope :

Les options de DefaultScope :

  1. App :

    • Les fichiers sont stockés dans un répertoire spécifique à l'application sur le stockage externe.

    • Ce mode est recommandé pour la plupart des applications modernes.

    • Compatible avec Android 2.2 et versions ultérieures.

  2. Asset :

    • Les fichiers sont lus à partir des ressources intégrées à l'application (assets).

    • Ces fichiers sont en lecture seule et ne peuvent pas être modifiés ou écrits.

  3. Legacy :

    • Utilise les règles de stockage des versions antérieures d'App Inventor (avant la version nb187).

    • Les fichiers sont lus ou écrits dans le répertoire racine du stockage externe (ex. : /sdcard/).

    • Ce mode est obsolète et ne fonctionne pas sur Android 11 ou versions ultérieures.

  4. Private :

    • Les fichiers sont stockés dans le répertoire privé de l'application.

    • Ce mode est utilisé pour des données sensibles qui ne doivent pas être accessibles par d'autres applications ou utilisateurs.

  5. Shared :

    • Les fichiers sont placés dans les répertoires partagés du système, comme les dossiers Pictures, Music, ou Downloads.

    • Idéal pour partager des fichiers avec d'autres applications ou rendre les fichiers visibles pour l'utilisateur.

Utilisation recommandée :

  • Le mode App est généralement suffisant pour la plupart des applications modernes.

  • Si vous avez besoin d'accéder à des ressources intégrées, utilisez Asset.

  • Pour des données sensibles, préférez le mode Private.

  • Évitez le mode Legacy, sauf si vous travaillez avec de très anciennes versions d'Android.

  • Utilisez Shared pour rendre les fichiers accessibles dans les répertoires publics du système.

exemples de code

Bien sûr, je vais vous donner quelques exemples de code pour illustrer l'utilisation des différents DefaultScope dans App Inventor. Notez que dans App Inventor, le code est principalement créé via une interface graphique de blocs, mais je vais décrire les actions et les blocs à utiliser pour chaque exemple.

1. App Scope

Exemple : Sauvegarder un score dans un fichier

1. Utiliser un composant Fichier avec DefaultScope réglé sur "App"
2. Utiliser le bloc "call Fichier1.WriteFile" avec :
- fileName : "score.txt"
- text : un bloc contenant le score (par exemple, une variable globale scoreActuel)
3. Pour lire le score :
- Utiliser le bloc "call Fichier1.ReadFrom" avec fileName : "score.txt"

2. Assets Scope

Exemple : Lire un fichier de configuration depuis les assets

1. Ajouter un fichier "config.txt" dans les assets du projet
2. Utiliser un composant Fichier avec DefaultScope réglé sur "Assets"
3. Utiliser le bloc "call Fichier1.ReadFrom" avec :
- fileName : "config.txt"
4. Le contenu sera disponible dans le bloc "got text"

3. Private Scope

Exemple : Stocker un token d'authentification

1. Utiliser un composant Fichier avec DefaultScope réglé sur "Private"
2. Pour sauvegarder le token :
- Utiliser le bloc "call Fichier1.WriteFile" avec :
- fileName : "auth_token.txt"
- text : le token d'authentification
3. Pour lire le token :
- Utiliser le bloc "call Fichier1.ReadFrom" avec :
- fileName : "auth_token.txt"

4. Shared Scope

Exemple : Sauvegarder une image dans le dossier Pictures

1. Utiliser un composant Fichier avec DefaultScope réglé sur "Shared"
2. Après avoir capturé une image avec le composant Camera :
- Utiliser le bloc "call Fichier1.SaveFile" avec :
- fileName : "Pictures/mon_image.jpg"
- content : le bloc contenant l'image capturée

5. Legacy Scope (à éviter sur les versions récentes d'Android)

Exemple : Lire un fichier à la racine du stockage externe

1. Utiliser un composant Fichier avec DefaultScope réglé sur "Legacy"
2. Utiliser le bloc "call Fichier1.ReadFrom" avec :
- fileName : "mon_fichier.txt"
(Cela lira le fichier depuis la racine du stockage externe, par exemple /sdcard/mon_fichier.txt)

Rappelez-vous que ces exemples sont conceptuels et que la mise en œuvre exacte dépendra de la structure de votre application et des autres composants que vous utilisez. De plus, il est toujours recommandé de gérer les erreurs potentielles lors des opérations de lecture/écriture de fichiers.

Donner un exemple de code App Inventor utilisant le SAF

Voici un exemple de code App Inventor utilisant le SAF (Storage Access Framework) pour créer et écrire dans un fichier texte :

// Ouvrir le sélecteur de dossier
when Button1.Click
do SAF1.OpenDocumentTree("Sélectionnez un dossier")
end

// Créer et écrire dans le fichier
when SAF1.GotUri
do SAF1.CreateDocument(get uri, "mon_fichier.txt", "text/plain")
end

when SAF1.DocumentCreated
do SAF1.WriteToFile(get uriString, "Contenu du fichier")
end

// Afficher le résultat
when SAF1.GotWriteResult
if get response = get uriString then
Notifier1.ShowAlert("Fichier créé et écrit avec succès")
else
Notifier1.ShowAlert("Erreur : " + get response)
end
end

Ce code permet de :

  1. Ouvrir un sélecteur de dossier lorsque l'utilisateur clique sur un bouton.

  2. Créer un nouveau fichier texte nommé "mon_fichier.txt" dans le dossier sélectionné.

  3. Écrire le contenu "Contenu du fichier" dans le fichier créé.

  4. Afficher une notification indiquant si l'opération a réussi ou échoué.

Pour utiliser ce code, vous devez d'abord ajouter l'extension SAF à votre projet App Inventor. Assurez-vous également d'avoir les composants Button1 et Notifier1 dans votre interface utilisateur[1][2].



  1. https://community.kodular.io/t/saf-app-inventor-implementation-of-storage-access-framework/144020

  2. https://community.appinventor.mit.edu/t/saf-app-inventor-implementation-of-storage-access-framework/41603



App Inventor : Fichiers dans le dossier Documents

 


Dans App Inventor, peut-on stocker ses données dans un fichier situé dans le dossier Documents et si oui par quelle requête y accèder

Voici comment procéder :

  1. Créer ou accéder à un fichier :

    Utilisez le bloc "File.AppendToFile" pour créer un nouveau fichier ou ajouter du contenu à un fichier existant dans le dossier Documents[1].
    Utilisez le bloc "File.ReadFrom" pour ouvrir et lire le contenu d'un fichier existant[1].
    Utilisez le bloc "File.SaveFile" pour écrire ou remplacer le contenu d'un fichier[1].


    do
    File.AppendToFile("/storage/emulated/0/Documents/notes.txt", TextBox1.Text)
    Notifier.ShowAlert("Note sauvegardée !")

  2. Lire le contenu d'un fichier :

  3. Écrire dans un fichier :

Pour spécifier le chemin d'accès au fichier dans le dossier Documents, utilisez la syntaxe suivante :

/storage/emulated/0/Documents/nomdefichier.txt

Il est important de noter que vous devez demander les autorisations nécessaires pour accéder au stockage externe de l'appareil dans votre application App Inventor

Enfin, pour une gestion plus avancée des données, vous pouvez également envisager d'utiliser des fichiers CSV, qui permettent de stocker des données tabulaires et sont facilement manipulables dans App Inventor


avec exemple

 Voici un exemple de comment y accéder et le manipuler :

Création et écriture dans un fichier

Pour créer un fichier et y écrire des données, utilisez les blocs suivants :

File.AppendToFile("/storage/emulated/0/Documents/monfichier.txt", "Données à stocker")

Ce bloc créera un fichier nommé "monfichier.txt" dans le dossier Documents et y écrira le texte "Données à stocker"

Lecture d'un fichi

Pour lire le contenu d'un fichier existant, utilisez les blocs suivants :

File.ReadFrom("/storage/emulated/0/Documents/monfichier.txt")

Ce bloc lira le contenu du fichier "monfichier.txt" situé dans le dossier Documents.

Exemple pratique

Voici un exemple plus complet pour illustrer l'utilisation de fichiers dans App Inventor :

  1. Créez un bouton "Sauvegarder" et un champ de texte dans l'interface.

  2. Ajoutez un composant File (non visible) à votre projet.

  3. Dans les blocs, créez un gestionnaire d'événements pour le bouton "Sauvegarder" :

when Sauvegarder.Click

  1. Créez un bouton "Charger" et ajoutez le code suivant :

when Charger.Click
do
set TextBox1.Text to File.ReadFrom("/storage/emulated/0/Documents/notes.txt")

Ce code permettra à l'utilisateur de sauvegarder le texte entré dans un fichier "notes.txt" dans le dossier Documents, et de le charger ultérieuremen

N'oubliez pas de demander les autorisations nécessaires pour accéder au stockage externe dans les paramètres de votre application App Inventor.

App Inventor : Zone de texte, comment introduire du texte

 Dans App Inventor, comment introduire un texte dans un élément zone de texte

Pour introduire un texte dans un élément zone de texte dans App Inventor, vous pouvez suivre ces étapes :

  1. Dans la fenêtre "Designer", ajoutez un composant "Zone de texte" (TextBox) à votre interface en le faisant glisser depuis la palette vers le visualiseur[1].

  2. Sélectionnez la zone de texte dans la liste des composants ou directement dans le visualiseur[2].

  3. Dans le panneau des propriétés à droite, vous pouvez définir les caractéristiques de la zone de texte[2][1] :

    • Modifiez la propriété "Text" pour définir un texte par défaut qui apparaîtra dans la zone de texte[3].

    • Ajustez d'autres propriétés comme la taille de la police, la couleur de fond, ou la largeur selon vos besoins[1].

  4. Pour récupérer le texte saisi par l'utilisateur dans la zone de texte, utilisez le bloc "TextBox1.Text" dans la fenêtre "Blocks"[4].

  5. Vous pouvez ensuite utiliser ce texte dans votre logique d'application, par exemple pour l'afficher dans un label ou le traiter d'une autre manière[5][4].


avec un exemple

Bien sûr, je vais vous donner un exemple concret pour illustrer comment introduire et utiliser un texte dans une zone de texte dans App Inventor.

Exemple : Créer une application de salutation personnalisée

Dans cet exemple, nous allons créer une application simple qui demande le nom de l'utilisateur dans une zone de texte, puis affiche un message de salutation personnalisé lorsqu'un bouton est pressé.

Étape 1 : Configuration de l'interface utilisateur

Dans la vue "Designer" :
  1. Ajoutez une Zone de texte (TextBox)

    • Renommez-la en "txtNom"

    • Dans les propriétés, définissez Hint à "Entrez votre nom"

  2. Ajoutez un Bouton (Button)

    • Renommez-le en "btnSaluer"

    • Dans les propriétés, définissez Text à "Saluer"

  3. Ajoutez un Label

    • Renommez-le en "lblSalutation"

    • Laissez le texte vide pour l'instant

Étape 2 : Programmation des blocs

Dans la vue "Blocks" :

  1. Ajoutez un bloc "when btnSaluer.Click do"

  2. À l'intérieur de ce bloc, ajoutez :

    1. Un bloc "set lblSalutation.Text to"

    2. Connectez-y un bloc de texte (join)

    3. Dans le bloc join, mettez "Bonjour, " comme premier élément

    4. Comme deuxième élément du join, ajoutez un bloc "txtNom.Text"

Voici à quoi devraient ressembler vos blocs :

when btnSaluer.Click
set lblSalutation.Text to
join("Bonjour, ", txtNom.Text)


Fonctionnement de l'application

  1. L'utilisateur entre son nom dans la zone de texte "txtNom".

  2. L'utilisateur appuie sur le bouton "Saluer".

  3. Le texte du label "lblSalutation" est mis à jour avec un message personnalisé, par exemple "Bonjour, Alice" si l'utilisateur a entré "Alice".

Cet exemple simple montre comment :

  • Introduire du texte dans une zone de texte (via l'interface utilisateur)

  • Récupérer le texte de la zone de texte (avec txtNom.Text)

  • Utiliser ce texte pour créer un message personnalisé

Vous pouvez bien sûr élaborer davantage cette application en ajoutant des fonctionnalités supplémentaires ou en personnalisant l'interface utilisateur selon vos besoins.

App Inventor : fichiers de données, stockage et requête d'accès

 Dans App Inventor, où placer les fichiers de données et par quelle requête peut-on y accéder

Dans App Inventor, il existe plusieurs options pour placer et accéder aux fichiers de données :

Stockage interne de l'application

Les fichiers peuvent être stockés dans le répertoire privé de l'application :

  • Chemin : /data/user/0/<nom_du_package>/files/

  • Accès : Utilisez la méthode ReadFrom() du composant File sans préfixe[1][2]

Par exemple :

File1.ReadFrom("monfichier.txt")

Stockage externe (carte SD)

Les fichiers peuvent être placés sur la carte SD :

  • Chemin : /sdcard/ ou /storage/emulated/0/

  • Accès : Préfixez le nom du fichier avec / dans ReadFrom()[1][3]

Par exemple :

File1.ReadFrom("/monfichier.txt")

Assets de l'application

Les fichiers peuvent être inclus dans les assets du projet :

  • Placement : Téléchargez le fichier dans la section Media du projet

  • Accès : Préfixez le nom du fichier avec // dans ReadFrom()[3][2]

Par exemple :

File1.ReadFrom("//monfichier.txt")

Considérations importantes

  • Le composant File permet de lire et écrire des fichiers sur l'appareil[4][3].

  • Pour les applications packagées, les fichiers sont lus/écrits dans le stockage privé de l'application sur Android 2.2+[3].

  • Lors du développement avec le Companion, les fichiers sont lus/écrits dans /sdcard/AppInventor/data[3].

Il est recommandé d'utiliser le stockage interne de l'application pour la sécurité des données, et les assets pour les fichiers statiques inclus dans l'application.

vendredi 31 janvier 2025

Références App Inventor pour application GPS

Attention : la première réception du signal GPS et calcul de position demande une trentaine de secondes. Après, le changement de position est plus rapide, environ 5 secondes


Attention : la sauvegarde sur fichier :

avec Companion : mettre le nom du fichier avec un slash devant /monfichier.gpx et il est sauvegardé dans :
Android/data/edu.mit.appinventor.aicompanion3/files/monfichier.gpx
après compilation et exécution du fichier compilé ; le fichier monfichier.gpx est sauvegardé dans :
Android/data/appinventor.ai_monCompte.monProjet/files/monfichier.gpx

Go to MIT App Inventor and sign in with your Google account.

Start a new project and give it a name, e.g., "GPX_Recorder".

Design the User Interface:


Add a Button component for starting and stopping the recording.

Add a Label component to display the status.

Add a TinyDB component for storing the GPX data.

Add a LocationSensor component to get the GPS coordinates.

Create the blocks to handle the logic:


Here's the layout and the logic for the app:


Designer View

Drag and drop the following components:

Button

Text: "Start Recording"

Name: StartButton

Button

Text: "Stop Recording"

Name: StopButton

Button

Text: "Save GPX File"

Name: SaveButton

Label

Text: "Status: Not recording"

Name: StatusLabel

LocationSensor

Name: LocationSensor1

TinyDB

Name: TinyDB1


Blocks View

Initialize the components and variables:


blocks

// Initialize global variables

initialize global recording to false

initialize global gpxData to "<gpx version='1.1' creator='AppInventor'><trk><name>Track</name><trkseg>"


// Start Button Click Event

when StartButton.Click

  set global recording to true

  set StatusLabel.Text to "Status: Recording"

  call LocationSensor1.Start


// Stop Button Click Event

when StopButton.Click

  set global recording to false

  set StatusLabel.Text to "Status: Not recording"

  call LocationSensor1.Stop


// Save Button Click Event

when SaveButton.Click

  call TinyDB1.StoreValue

    tag: "gpxData"

    value: join (global gpxData) "</trkseg></trk></gpx>"

  set StatusLabel.Text to "Status: GPX File Saved"


// LocationSensor Location Changed Event

when LocationSensor1.LocationChanged

  if global recording

    set global gpxData to join (global gpxData) "<trkpt lat='" (LocationSensor1.Latitude) "' lon='" (LocationSensor1.Longitude) "'><ele>" (LocationSensor1.Altitude) "</ele><time>" (Clock.Now) "</time></trkpt>"


jeudi 16 janvier 2025

Générer un fond MBtiles pour OruxMaps avec QGIS

Avoir un fond cartographique, topo ou photo, bien géoréférencé et organisé sous forme de tuiles d'échelle différente, est nécessaire pour se repérer avec son smartphone.

Encore faut-il que l'application de randonnée reconnaisse le format de fichiers de ces tuiles.
C'est le cas d'OruxMaps qui est capable de traiter des fichiers MBtiles.
QGIS va nous servir à extraire des tuiles MBtiles.

Le fichier MBTILES est un fichier raster qui peut inclure non seulement le fond de carte, mais aussi des tracés (GPX ou KML). Si on veut inclure un tracé KML, il suffit d'ajouter une couche vectorielle. On peut aussi ajouter un polygone.

 Avec QGIS, ouvrir une nouvelle couche.

Choisir sur le serveur WMS/WMTS, IGN par exemple ou autre, le secteur concerné par l'étude.
Dans la boîte à outils, choisir :

Outils Raster > Générer des tuiles XYZ (MB tiles).

Paramètres :

Emprise : dessiner sur le canevas de la carte
Zoom minimum : 12
Zoom maximum : 16 (plus ou moins selon le degré de précision)
DPI (Dots per Inch) : 96 ou 300
Qualité : 75
Taille de la Métatile : 4
Sortie : choisir un dossier, par exemple celui de téléchargement, et un nom de fichier (monsecteur par exemple).

Avec OruxMaps :

Déplacer le fichier .mbtiles dans le dossier Mapfiles d'OruxMaps
--> nouvelle carte hors-ligne
Choisir le nom de la carte téléchargée.