Partager via


Stockage externe

Le stockage externe fait référence au stockage de fichiers qui n’est pas sur le stockage interne et non exclusivement accessible à l’application responsable du fichier. L’objectif principal du stockage externe est de fournir un emplacement permettant de placer des fichiers destinés à être partagés entre des applications ou trop volumineux pour s’adapter au stockage interne.

Historiquement parlant, le stockage externe fait référence à une partition de disque sur un support amovible tel qu’une carte SD (également appelée stockage portable). Cette distinction n’est plus aussi pertinente que les appareils Android ont évolué et de nombreux appareils Android ne prennent plus en charge le stockage amovible. Au lieu de cela, certains appareils allouent une partie de leur mémoire interne non volatile à Android, ce qui peut effectuer la même fonction que le support amovible. Il s’agit d’un stockage émulé et est toujours considéré comme un stockage externe. Sinon, certains appareils Android peuvent avoir plusieurs partitions de stockage externe. Par exemple, une tablette Android (en plus de son stockage interne) peut avoir émulé le stockage et un ou plusieurs emplacements pour une carte SD. Toutes ces partitions sont traitées par Android comme un stockage externe.

Sur les appareils qui ont plusieurs utilisateurs, chaque utilisateur dispose d’un répertoire dédié sur la partition de stockage externe principale pour son stockage externe. Les applications s’exécutant en tant qu’utilisateur n’ont pas accès aux fichiers d’un autre utilisateur sur l’appareil. Les fichiers pour tous les utilisateurs sont toujours lisibles dans le monde et accessibles en écriture mondiale ; Toutefois, Android bac à sable chaque profil utilisateur des autres utilisateurs.

La lecture et l’écriture dans des fichiers sont presque identiques dans Xamarin.Android, car il s’agit d’une autre application .NET. L’application Xamarin.Android détermine le chemin d’accès au fichier qui sera manipulé, puis utilise des idiomes .NET standard pour l’accès aux fichiers. Étant donné que les chemins d’accès réels au stockage interne et externe peuvent varier d’un appareil à l’autre ou d’une version Android à une version Android, il n’est pas recommandé de coder en dur le chemin d’accès aux fichiers. Au lieu de cela, Xamarin.Android expose les API Android natives qui vous aideront à déterminer le chemin d’accès aux fichiers sur le stockage interne et externe.

Ce guide décrit les concepts et LES API dans Android spécifiques au stockage externe.

Fichiers publics et privés sur le stockage externe

Il existe deux types de fichiers différents qu’une application peut conserver sur le stockage externe :

  • Fichiers privés : les fichiers privés sont des fichiers spécifiques à votre application (mais qui sont toujours lisibles dans le monde et accessibles en écriture). Android s’attend à ce que les fichiers privés soient stockés dans un répertoire spécifique sur le stockage externe. Même si les fichiers sont appelés « privés », ils sont toujours visibles et accessibles par d’autres applications sur l’appareil, ils ne sont pas accordés à une protection spéciale par Android.

  • Fichiers publics : il s’agit de fichiers qui ne sont pas considérés comme spécifiques à l’application et qui sont destinés à être partagés librement.

Les différences entre ces fichiers sont principalement conceptuelles. Les fichiers privés sont privés dans le sens où ils sont considérés comme faisant partie de l’application, tandis que les fichiers publics sont tous les autres fichiers qui existent sur le stockage externe. Android fournit deux API différentes pour résoudre les chemins d’accès aux fichiers privés et publics, mais sinon les mêmes API .NET sont utilisées pour lire et écrire dans ces fichiers. Il s’agit des mêmes API que celles présentées dans la section sur la lecture et l’écriture.

Fichiers externes privés

Les fichiers externes privés sont considérés comme spécifiques à une application (comme les fichiers internes), mais sont conservés sur le stockage externe pour un certain nombre de raisons (par exemple, étant trop volumineux pour le stockage interne). Comme pour les fichiers internes, ces fichiers sont supprimés lorsque l’application est désinstallée par l’utilisateur.

L’emplacement principal des fichiers externes privés est trouvé en appelant la méthode Android.Content.Context.GetExternalFilesDir(string type). Cette méthode retourne un Java.IO.File objet qui représente le répertoire de stockage externe privé de l’application. Le passage null à cette méthode retourne le chemin d’accès au répertoire de stockage de l’utilisateur pour l’application. Par exemple, pour une application portant le nom com.companyname.appdu package, le répertoire « racine » des fichiers externes privés serait :

/storage/emulated/0/Android/data/com.companyname.app/files/

Ce document fait référence au répertoire de stockage des fichiers privés sur le stockage externe en tant que PRIVATE_EXTERNAL_STORAGE.

Le paramètre pour GetExternalFilesDir() lequel il s’agit d’une chaîne qui spécifie un répertoire d’application. Il s’agit d’un répertoire destiné à fournir un emplacement standard pour une organisation logique de fichiers. Les valeurs de chaîne sont disponibles via des constantes sur la Android.OS.Environment classe :

Android.OS.Environment Répertoire
DirectoryAlarms PRIVATE_EXTERNAL_STORAGE/Alarmes
DirectoryDcim PRIVATE_EXTERNAL_STORAGE/DCIM
DirectoryDownloads PRIVATE_EXTERNAL_STORAGE/Télécharger
DirectoryDocuments PRIVATE_EXTERNAL_STORAGE/Documents
DirectoryMovies PRIVATE_EXTERNAL_STORAGE/Films
DirectoryMusic PRIVATE_EXTERNAL_STORAGE/Musique
DirectoryNotifications PRIVATE_EXTERNAL_STORAGE/Notifications
DirectoryPodcasts PRIVATE_EXTERNAL_STORAGE/Podcasts
DirectoryRingtones PRIVATE_EXTERNAL_STORAGE/Sonneries
DirectoryPictures PRIVATE_EXTERNAL_STORAGE/Images

Pour les appareils qui ont plusieurs partitions de stockage externe, chaque partition a un répertoire destiné aux fichiers privés. La méthode Android.Content.Context.GetExternalFilesDirs(string type) retourne un tableau de Java.IO.Files. Chaque objet représente un répertoire privé spécifique à l’application sur tous les appareils de stockage partagé/externe où l’application peut placer les fichiers qu’elle possède.

Important

Le chemin exact vers le répertoire de stockage externe privé peut varier d’un appareil à l’autre et entre les versions d’Android. En raison de cela, les applications ne doivent pas coder en dur le chemin d’accès à ce répertoire, et utiliser plutôt les API Xamarin.Android, telles que Android.Content.Context.GetExternalFilesDir().

Fichiers externes publics

Les fichiers publics sont des fichiers qui existent sur le stockage externe qui ne sont pas stockés dans le répertoire qu’Android alloue pour les fichiers privés. Les fichiers publics ne seront pas supprimés lorsque l’application est désinstallée. Les applications Android doivent être autorisées avant de pouvoir lire ou écrire des fichiers publics. Il est possible que les fichiers publics existent n’importe où sur le stockage externe, mais par convention Android s’attend à ce que les fichiers publics existent dans le répertoire identifié par la propriété Android.OS.Environment.ExternalStorageDirectory. Cette propriété retourne un Java.IO.File objet qui représente le répertoire de stockage externe principal. Par exemple, Android.OS.Environment.ExternalStorageDirectory vous pouvez faire référence au répertoire suivant :

/storage/emulated/0/

Ce document fait référence au répertoire de stockage des fichiers publics sur le stockage externe en tant que PUBLIC_EXTERNAL_STORAGE.

Android prend également en charge le concept de répertoires d’applications sur PUBLIC_EXTERNAL_STORAGE. Ces répertoires sont exactement identiques aux répertoires d’application et PRIVATE_EXTERNAL_STORAGE sont décrits dans le tableau de la section précédente. La méthode Android.OS.Environment.GetExternalStoragePublicDirectory(string directoryType) retourne un Java.IO.File objet qui correspond à un répertoire d’application publique. Le directoryType paramètre est un paramètre obligatoire et ne peut pas être null.

Par exemple, l’appel Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments).AbsolutePath retourne une chaîne semblable à :

/storage/emulated/0/Documents

Important

Le chemin exact vers le répertoire de stockage externe public peut varier d’un appareil à l’autre et entre les versions d’Android. En raison de cela, les applications ne doivent pas coder en dur le chemin d’accès à ce répertoire, et utiliser plutôt les API Xamarin.Android, telles que Android.OS.Environment.ExternalStorageDirectory.

Utilisation du stockage externe

Une fois qu’une application Xamarin.Android a obtenu le chemin complet d’un fichier, elle doit utiliser l’une des API .NET standard pour la création, la lecture, l’écriture ou la suppression de fichiers. Cela optimise la quantité de code compatible multiplateforme pour une application. Toutefois, avant de tenter d’accéder à un fichier, une application Xamarin.Android doit s’assurer qu’il est possible d’accéder à ce fichier.

  1. Vérifier le stockage externe : selon la nature du stockage externe, il est possible qu’il ne soit pas monté et utilisable par l’application. Toutes les applications doivent vérifier l’état du stockage externe avant de tenter de l’utiliser.
  2. Effectuer une vérification des autorisations d’exécution : une application Android doit demander l’autorisation de l’utilisateur pour accéder au stockage externe. Cela signifie qu’une demande d’autorisation d’exécution doit être effectuée avant tout accès aux fichiers. Les autorisations du guide dans Xamarin.Android contiennent plus de détails sur les autorisations Android.

Chacune de ces deux tâches sera abordée ci-dessous.

Vérification de la disponibilité du stockage externe

La première étape avant d’écrire dans le stockage externe consiste à vérifier qu’il est lisible ou accessible en écriture. La Android.OS.Environment.ExternalStorageState propriété contient une chaîne qui identifie l’état du stockage externe. Cette propriété retourne une chaîne qui représente l’état. Ce tableau est une liste des ExternalStorageState valeurs qui peuvent être retournées par Environment.ExternalStorageState:

ExternalStorageState Description
MediaBadRemoval Les médias ont été brusquement retirés sans être correctement montés.
MediaChecking Le média est présent mais subit une vérification de disque.
MediaEjecting Les médias sont en train d’être montés et éjectés.
MediaMounted Le support est monté et peut être lu ou écrit dans.
MediaMountedReadOnly Le support est monté, mais ne peut être lu qu’à partir de.
MediaNofs Le média est présent, mais ne contient pas de système de fichiers adapté à Android.
MediaRemoved Il n’y a pas de médias présents.
MediaShared Le média est présent, mais n’est pas monté. Il est partagé via USB avec un autre appareil.
MediaUnknown L’état du média n’est pas reconnu par Android.
MediaUnmountable Le média est présent, mais ne peut pas être monté par Android.
MediaUnmounted Le média est présent, mais n’est pas monté.

La plupart des applications Android doivent uniquement vérifier si le stockage externe est monté. L’extrait de code suivant montre comment vérifier que le stockage externe est monté pour un accès en lecture seule ou un accès en lecture-écriture :

bool isReadonly = Environment.MediaMountedReadOnly.Equals(Environment.ExternalStorageState);
bool isWriteable = Environment.MediaMounted.Equals(Environment.ExternalStorageState);

Autorisations de stockage externe

Android considère que l’accès au stockage externe est une autorisation dangereuse, ce qui exige généralement que l’utilisateur accorde son autorisation d’accéder à la ressource. L’utilisateur peut révoquer cette autorisation à tout moment. Cela signifie qu’une demande d’autorisation d’exécution doit être effectuée avant tout accès aux fichiers. Les applications sont automatiquement autorisées à lire et à écrire leurs propres fichiers privés. Il est possible que les applications lisent et écrivent les fichiers privés appartenant à d’autres applications après avoir reçu l’autorisation de l’utilisateur.

Toutes les applications Android doivent déclarer l’une des deux autorisations pour le stockage externe dans le AndroidManifest.xml . Pour identifier les autorisations, l’un des deux uses-permission éléments suivants doit être ajouté à AndroidManifest.xml :

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Remarque

Si l’utilisateur accorde WRITE_EXTERNAL_STORAGE, il READ_EXTERNAL_STORAGE est également accordé implicitement. Il n’est pas nécessaire de demander les deux autorisations dans AndroidManifest.xml.

Les autorisations peuvent également être ajoutées à l’aide de l’onglet Manifeste Android des propriétés de la solution :

Explorateur de solutions - Autorisations requises pour Visual Studio

En règle générale, toutes les autorisations dangereuses doivent être approuvées par l’utilisateur. Les autorisations pour le stockage externe sont une anomalie dans laquelle il existe des exceptions à cette règle, en fonction de la version d’Android que l’application exécute :

Organigramme des vérifications des autorisations de stockage externe

Pour plus d’informations sur l’exécution des demandes d’autorisation d’exécution, consultez le guide Autorisations dans Xamarin.Android. L’exemple LocalFiles monodroid illustre également une façon d’effectuer des vérifications d’autorisation d’exécution.

Octroi et révocation d’autorisations avec ADB

Au cours du développement d’une application Android, il peut être nécessaire d’accorder et de révoquer des autorisations pour tester les différents flux de travail impliqués dans les vérifications d’autorisations d’exécution. Il est possible de le faire à l’invite de commandes à l’aide d’ADB. Les extraits de ligne de commande suivants montrent comment accorder ou révoquer des autorisations à l’aide d’ADB pour une application Android dont le nom du package est com.companyname.app :

$ adb shell pm grant com.companyname.app android.permission.WRITE_EXTERNAL_STORAGE

$ adb shell pm revoke com.companyname.app android.permission.WRITE_EXTERNAL_STORAGE

Suppression de fichiers

Toutes les API C# standard peuvent être utilisées pour supprimer un fichier du stockage externe, par System.IO.File.Deleteexemple . Il est également possible d’utiliser les API Java au détriment de la portabilité du code. Par exemple :

System.IO.File.Delete("/storage/emulated/0/Android/data/com.companyname.app/files/count.txt");