web-dev-qa-db-fra.com

Android 10: Quelles sont mes options pour enregistrer des fichiers sur un stockage externe dans un répertoire appelé "/ sdcard / my-app /"

Jusqu'à Android Pie, j'ai toujours stocké les fichiers dont l'application avait besoin pour être stockés sur /sdcard/my-app/, Que j'ai obtenus via

File fBaseDir = new File(Environment.getExternalStorageDirectory(), "my-app");

L'une de mes applications stocke des centaines (jusqu'à plusieurs milliers) de favicons dans /sdcard/my-app/favicons, Et lorsque l'utilisateur crée une sauvegarde de l'application, elle est stockée dans /sdcard/my-app/backups. Captures d'écran de pages Web prises par Google Chrome lorsqu'il est partagé avec mon application sont stockés dans /sdcard/my-app/screenshots, Etc.).

Lorsque je désinstalle l'application, je peux la réinstaller plus tard et avoir toujours tous les favicons, captures d'écran et sauvegardes disponibles pour restaurer l'état et ne pas avoir à télécharger à nouveau tous les favicons (et éventuellement avoir perdu toutes les autres données).

Je peux également créer facilement une sauvegarde du répertoire /sdcard/my-app/ En le copiant sur mon PC et le restaurer sur un autre téléphone, par exemple lorsque je migre vers un nouvel appareil.

Je peux également utiliser un explorateur de fichiers pour voir quels fichiers se trouvent dans ce répertoire, les sélectionner et les envoyer par courrier électronique ou les copier sur Google Drive, ou supprimer certains d'entre eux spécifiquement (comme les anciens fichiers de sauvegarde).

Avec Android 10 cette approche s'est effondrée. Je ne peux pas ajouter les favicons au dossier Media Images, car ce ne sont pas de vraies images, elles encombreraient la vue inutilement et pourraient éventuellement interdire mon compte de développeur du Play Store pour cela. Je ne veux pas non plus stocker toutes ces données dans un répertoire App-Private, car elles seront supprimées lorsque l'application sera désinstallée et parce que d'autres applications comme un explorateur ne pourront pas y accéder.

Quelles sont mes options? La sélection manuelle de fichiers ou de répertoires n'est pas une option, sauf si le répertoire n'a besoin d'être sélectionné qu'une seule fois, puis l'accès est accordé pour toujours (pour lire et écrire des fichiers).

Je ne lis ni n'écris jamais en dehors de /sdcard/my-app/.

15
Daniel F

Dans Android Q L'accès direct aux fichiers est désactivé par défaut pour les applications en dehors de leurs dossiers privés. Voici quelques stratégies que vous pouvez utiliser dans votre cas:

  1. Utilisez l'option manifeste requestLegacyStorage pour avoir l'ancien comportement mais cela ne fonctionnera plus avec Android R, donc c'est vraiment une solution à court terme;
  2. Enregistrez vos fichiers en utilisant la méthode getExternalFilesDir(). C'est votre dossier privé, les autres applications ne peuvent accéder à ces fichiers que si elles ont l'autorisation READ_EXTERNAL_STORAGE. Dans ce cas, il serait bon d'utiliser FileProvider pour accorder l'accès à d'autres applications à vos fichiers.
  3. Utilisez la méthode getPrimaryStorageVolume().createOpenDocumentTreeIntent() de la classe StorageManager pour demander l'accès au volume primaire externe. Dans ce cas, vous avez besoin du consentement de l'utilisateur et vous ne pourrez pas utiliser File api directement de toute façon, mais en utilisant la classe DocumentFile, vous avez une interface très similaire, c'est donc la solution plus proche de la vieux comportement. Cela fonctionne si vous devez effectuer des opérations au premier plan et en arrière-plan, c'est-à-dire sans interaction de l'utilisateur, à l'exception de la première interaction à demander l'autorisation.

Je lie Flipper bibliothèque pour le point 3, cela aide à gérer les fichiers comme dans les anciennes versions Android.

12
greywolf82