web-dev-qa-db-fra.com

Comment l'accès au stockage change-t-il sur Android 6?

Contexte

Android a eu beaucoup de changements sur la façon de gérer la carte SD et le stockage en général:

  • API 3 - vous obtenez tous les accès, aucune autorisation requise
  • API 4-15 - vous devez utiliser WRITE_EXTERNAL_STORAGE et vous obtenez tous les accès.
  • API 16-18 - si vous souhaitez uniquement lire, utilisez READ_EXTERNAL_STORAGE
  • API 19-20: vous ne pouvez pas lire ou écrire sur un stockage externe secondaire (carte SD), sauf si votre application est une application système ou si vous avez une racine.
  • API 21-22 - pour accéder à la carte SD, vous devez demander l’autorisation de l’utilisateur et utiliser l’API DocumentFile au lieu de l’API File. Cela posait beaucoup de questions, comme je l’ai écrit à propos de ici , ici et ici .

À partir de l'API 23 (Android 6), les choses semblent encore changer ...

Le problème

Pour l'API 23, il y a au moins deux nouveautés liées au stockage:

  • " Périphériques de stockage à adopter " - L'utilisateur peut éventuellement configurer la carte SD en tant que quelque chose qui ressemble au stockage externe principal.
  • Dans le cadre du mécanisme new permissions (demande de permissions au moment de l'exécution), il semble que le stockage soit également une permission que l'utilisateur doit confirmer. C'est pour READ_EXTERNAL_STORAGE et WRITE_EXTERNAL_STORAGE

Comme il n’existe pas d’appareil Android 6 avec une carte SD et que l’émulateur lui-même n’a pas vraiment la capacité d’utiliser une carte SD, il est toujours impossible de savoir ce qui se passe.

Questions

  1. La carte SD obtiendra-t-elle l'accès à l'aide de File-API au lieu de DocumentFile?

  2. Si je veux accéder à tous les chemins de stockage externes (y compris la carte SD), cela signifie-t-il que je dois demander deux fois ces autorisations: une pour le stockage externe principal et une pour la carte SD?

  3. Les fichiers de la carte SD sont-ils accessibles de quelque manière que ce soit avant l'octroi manuel de l'autorisation?

  4. Supposons que l'utilisateur ait choisi d'utiliser "Périphériques de stockage pouvant être adoptés", qu'est-ce que cela signifie pour les différentes fonctions permettant de récupérer les chemins des fichiers de l'application? Par exemple: getFilesDir, getExternalFilesDir, ...? La commande de getExternalFilesDirs changerait-elle à cause de cela?

  5. Qu'advient-il des fichiers de l'application lorsque l'utilisateur déplace l'application de/vers la carte SD (à l'aide de "Adoptable Storage Devices")? Qu'en est-il des fichiers de l'application sur la carte SD? Resteraient-ils? Ou déménageraient-ils quelque part?

    Par exemple, si l'application a "file1.txt" sur la carte SD, sur le chemin "/ storage/extSdCard/Android/data/appPackageName" et si le fichier est "file2.txt" (ou même le même nom) sur le stockage externe principal dans le chemin "/ storage/émulated/0/Android/data/appPackageName". Après le basculement, que se passerait-il pour ces fichiers? Comment pourraient-ils fusionner dans un seul dossier, voire pas du tout?

  6. Lorsque vous déplacez l'application sur la carte SD (avec "Adoptable Storage Devices"), cela signifie-t-il qu'aucun stockage interne ne sera utilisé?

47
android developer

Laissez-moi répondre Périphériques de stockage pouvant être adoptés questions connexes:

  1. Supposons que l'utilisateur ait choisi d'utiliser "Périphériques de stockage pouvant être adoptés", que signifie-t-il pour les différentes fonctions qui extraient les chemins de les fichiers de l'application? Par exemple: getFilesDir, getExternalFilesDir, ...? La commande de getExternalFilesDirs changerait-elle à cause de cela?

Lorsque l’utilisateur choisit d’utiliser la carte SD en tant que "Périphérique de stockage pouvant être adopté" (Format interne), cela signifie que la carte SD est uniquement disponible en tant que stockage interne, c’est-à-dire qu’aucune carte SD n'est disponible pour stocker les fichiers téléchargés. Il n'y aura pas de changement d'ordre dans les chemins renvoyés par les méthodes associées. Par exemple: getExternalFilesDir () listera uniquement le chemin de stockage externe si l'utilisateur a formaté sa carte SD en tant que "Périphériques de stockage à adopter". Le chemin de la carte SD ne sera pas disponible.

  1. Qu'advient-il des fichiers de l'application lorsque l'utilisateur déplace l'application de/vers la carte SD (à l'aide de "Adoptable Storage Devices")? Quoi sur les fichiers de l'application sur la carte SD? Resteraient-ils? Ou seraient-ils déménager quelque part? Par exemple, si l'application a "file1.txt" sur le fichier Carte SD, sur le chemin "/ storage/extSdCard/Android/data/appPackageName", et il a un fichier "file2.txt" (ou même le même nom) sur le primaire stockage externe sur le chemin "/ stockage/émulé/0/Android/data/appPackageName". Après la commutation, qu'arriverait-il pour ces fichiers? Comment se fondraient-ils en un seul dossier, le cas échéant?

Chaque fois que l'utilisateur choisit sa carte SD comme "Périphériques de stockage adoptables", il doit alors formater sa carte SD en tant que stockage interne à l'aide de "Formater en interne" option. Format signifie que toutes les données/fichiers stockés sur la carte SD seront effacés. De même, lorsque l'utilisateur souhaite retirer sa carte SD de "Adoptable Storage Devices", il doit à nouveau formater sa carte SD en tant que stockage portable à l'aide de "Formater en tant que portable" option.

  1. Lorsque vous déplacez l'application sur la carte SD (avec "Adoptable Storage Devices"), cela signifie-t-il qu'aucun stockage interne ne sera utilisé?

Oui, la mémoire interne d'origine ne sera pas utilisée. Seul le stockage sur carte SD sera utilisé car après avoir choisi la carte SD comme "Périphériques de stockage pouvant être adoptés". Toutes les données/cache seront stockés sur la carte SD

10
VicJordan

Pour répondre à votre question 5: sous Android 7, tous les fichiers de la zone "données publiques", /storage/emulated/0/ (ou un emplacement spécifique du fabricant; c’est le répertoire contenant DCIMDownloads, etc.), sont stockés entièrement dans la mémoire interne ou entièrement. sur la carte SD adoptée. Après le format initial d'une carte SD adoptée, l'utilisateur se verra offrir la possibilité de "migrer des données", qui déplacera l'ensemble du /storage/emulated/0 sur la carte SD. À tout moment, l'utilisateur peut également accéder à Paramètres/Stockage , choisir la zone de stockage qui ne contient pas actuellement la zone de données publique, puis cliquer sur l'icône (trois points verticaux) dans le coin supérieur droit pour afficher un menu avec l'option "Migrer les données".

Il semble qu’aucun utilisateur ni aucune application ne puisse forcer un fichier public particulier sur la carte SD si une carte adoptée est en cours d’utilisation; c'est tout ou rien. (Le stockage privé de l'application se trouvera dans la mémoire interne ou sur la carte SD, que l'application ait été déplacée ou non sur la carte SD. Là aussi, il apparaît que l'application n'utilisera jamais que l'un ou l'autre, pas les deux. .)

1
Curt J. Sampson