Accueil / Articles PiApplications. / La plate-forme Android / Partage de données.

Données : le système de fichier.

L'utilisation du système de fichier a toujours été le moyen privilégié pour des processus différents de partager des données en toute sécurité. Cette sécurité est apportée par le système d'exploitation qui gère les descripteurs de fichier directement. C'est pour cela que l'on dit d'un descripteur de fichier qu'il est un "objet du noyau". Android en tant que système Linux dispose d'un système de fichier construit sur une arborescence dont une partie est imposée par le système d'exploitation.

Accès en lecture et en écriture.

Il est donc possible d'accéder au système de fichier et de l'utiliser comme on le fait en code Java. Les classes du package java.io sont en effet utilisables à cet effet et s'appuient sur le mécanisme de droits de tout système Linux.

L'accès au système de fichier est cependant sévèrement contrôlé par la plate-forme. Lorsque vous accédez à un fichier via une des classes du package java.io, il est plus que probable que l'application devra en demander l'autorisation via son manifeste. Cela donne la possibilité à l'utilisateur de refuser cet accès s'il estime sa sécurité compromise.

Toutefois, Android vous évite d'avoir à vous préoccuper de la sécurité ainqi que de la connaissance complète du système de fichier grâce à la méthode FileOutputStream openFileOutput(String sName, int iAccessMode) de la classe Context. Cette méthode créée le fichier dans un espace privé réservé à l'application (data/data/{nom du package}/files/{sName}. La méthode File getFileStreamPath(String sName) permet alors de savoir où se trouve le répertoire de l'application.

Pour la lecture, la classe Context dispose d'un méthode duale ne nécessitant pas d'autorisation particulière dans le manifeste : FileInputStream openFileInput(String sName).

La sécurité d'accès aux fichiers repose sur l'identifiant Linux de l'utilisateur (uid) attaché à l'application. Lorsqu'un groupe d'applications doit partager les mêmes fichiers mais que ces derniers doivent restés masqués aux autres applications, il peut être utile de leur faire partager le même uid. On peut imposer cet identifiant via le manifeste des applications (attribut android:sharedUserId="{uid}").

Enfin, l'outil adb du SDK Android permet de copier des fichiers vers ou depuis un périphérique Android.

Les fichiers en tant que ressources.

Un autre moyen pratique pour configurer une application ou partager des données et l'emploi des fichiers en tant que ressources. On distingue alors les fichiers "bruts" des fichiers "XML".

Dans le cas des fichiers "bruts", vous devez les placer sur le chemin res/raw de l'application en cours de développement. A cet emplacement, il ne sera pas compilé mais restera accessible :

Resources rsr = getResources();
InputStream ist = null;
try
{
  ist = rsr.openRawResource(R.raw.people);
  byte[] ab = new byte[ist.available()];
  while (ist.read(ab) != -1)
  {
    // lecture du fichier
  }
  // Utilisation du contenu du fichier
}
catch (IOException e)
{
  // Trace ou gestion de l'erreur
}
finally
{
  if (ist != null)
  {
    try
    {
      ist.close();
    }
    catch (IOException ioe)
    {
      // swallow
    }
  }
}

Là encore, c'est la méthode getResources de la classe Context qui facilite les choses. Il est possible de placer tout type de fichier en tant que ressource (vidéo, photo, texte, document, image, etc.).

Lorsque le fichier est de type "XML", il faut le placer sur le chemin res/xml de l'application en cours de développement.

La différence avec les fichiers "bruts", c'est que lors de la génération de l'application les fichiers XML sont transformés en une ressource binaire.

XmlPullParser xpp = getResources().getXml({identifiant de la ressource});
StringBuffer sbf = new StringBuffer();
try
{
  while (xpp.next() != XmlPullParser.END_DOCUMENT)
  {
    String sElement = xpp.getName();
    if ((sName != null) && sName.equals("{nom de l'élément chargé}"))
    {
      // Lecture des attributs
      int iSize = xpp.getAttributeCount();
      for (int i = 0; i < iSize; i++)
      {
        ...
      }
      // Utilisation des données lues
      ...
    }
  }
}
catch (Exception exc)
{
  // traçage ou gestion de l'erreur
}

En complément à cet article sur les fichiers: les cartes SD. Ces cartes sont des extensions de mémoire de masse que la plupart des périphériques Android acceptent. Sur un périphérique émulé, vous devez utiliser l'outil mksdcard pour en déclarer une. Une fois déclarée, vous devez démarrer l'émulateur avec l'option -sdcard {chemin du fichier représentant la carte SD}. Le plus souvent, la carte SD est "montée" sur le chemin /sdcard.

(c) PiApplications 2016