Android Android: Stockage interne et externe - Clarification de la terminologie


Exemple

Les développeurs Android (principalement les débutants) ont été confus en ce qui concerne la terminologie de stockage interne et externe. Il y a beaucoup de questions sur Stackoverflow à propos de la même chose. Cela est principalement dû au fait que la terminologie selon la documentation Google / Android officielle est très différente de celle de l'utilisateur normal du système d'exploitation Android. J'ai donc pensé que documenter cela aiderait.

Ce que nous pensons - Terminologie de l'utilisateur (UT)

Stockage interne (UT) Stockage externe (UT)
Mémoire interne intégrée au téléphone carte SD (Secure Digital) amovible ou stockage micro SD
Exemple: mémoire interne de 32 Go de Nexus 6P. Exemple: espace de stockage dans des cartes SD amovibles fournies par des fournisseurs tels que samsung, sandisk, strontium, transcend et autres

Mais, selon Android Documentation / Guide - Terminologie de Google (GT)

Stockage interne (GT):

Par défaut, les fichiers enregistrés dans le stockage interne sont privés pour votre application et les autres applications ne peuvent pas y accéder (ni l'utilisateur).

Stockage externe (GT):

Cela peut être un support de stockage amovible (comme une carte SD) ou un stockage interne (non amovible).

Le stockage externe (GT) peut être classé en deux types:

Stockage externe primaire Stockage externe secondaire ou stockage amovible (GT)
Ceci est identique à la mémoire interne intégrée du téléphone (ou) au stockage interne (UT) Ceci est identique au stockage sur carte micro SD amovible (ou) Stockage externe (UT)
Exemple: mémoire interne de 32 Go de Nexus 6P. Exemple: espace de stockage dans des cartes SD amovibles fournies par des fournisseurs tels que samsung, sandisk, strontium, transcend et autres
Ce type de stockage est accessible sur Windows PC en connectant votre téléphone au PC via un câble USB et en sélectionnant Camera (PTP) dans la notification des options USB. Ce type de stockage est accessible sur Windows PC en connectant votre téléphone au PC via un câble USB et en sélectionnant Transfert de fichiers dans la notification des options USB.

En un mot,

Stockage externe (GT) = Stockage interne (UT) et stockage externe (UT)

Stockage amovible (GT) = Stockage externe (UT)

Le stockage interne (GT) n'a pas de terme en UT.

Laissez-moi vous expliquer clairement,

Stockage interne (GT): par défaut, les fichiers enregistrés sur le stockage interne sont privés de votre application et les autres applications ne peuvent pas y accéder. Votre utilisateur de l'application ne peut pas non plus y accéder à l'aide du gestionnaire de fichiers. même après avoir activé l'option "Afficher les fichiers cachés" dans le gestionnaire de fichiers. Pour accéder aux fichiers dans le stockage interne (GT), vous devez rooter votre téléphone Android. De plus, lorsque l'utilisateur désinstalle votre application, ces fichiers sont supprimés / supprimés.

Donc, le stockage interne (GT) n'est pas ce que nous pensons comme la mémoire interne 32/64 Go de Nexus 6P

En règle générale, l'emplacement du stockage interne (GT) serait: /data/data/your.application.package.appname/someDirectory/

Stockage externe (GT):

Chaque appareil compatible Android prend en charge un «stockage externe» partagé que vous pouvez utiliser pour enregistrer des fichiers. Les fichiers enregistrés sur le stockage externe sont lisibles dans le monde entier et peuvent être modifiés par l'utilisateur lorsqu'ils permettent le stockage de masse USB pour transférer des fichiers sur un ordinateur.

Emplacement de stockage externe (GT): il peut se trouver n'importe où dans votre stockage interne ou dans votre stockage amovible, par exemple une carte micro SD. Cela dépend de l'OEM de votre téléphone et aussi de la version du système d'exploitation Android.

Pour lire ou écrire des fichiers sur le stockage externe (GT), votre application doit acquérir les autorisations système READ_EXTERNAL_STORAGE ou WRITE_EXTERNAL_STORAGE .

Par exemple:

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

Si vous devez à la fois lire et écrire des fichiers, vous devez demander uniquement l'autorisation WRITE_EXTERNAL_STORAGE , car cela nécessite implicitement un accès en lecture.

Dans le stockage externe (GT) , vous pouvez également enregistrer des fichiers qui sont app-private

Mais,

Lorsque l'utilisateur désinstalle votre application, ce répertoire et tout son contenu sont supprimés.

Quand avez-vous besoin de sauvegarder des fichiers qui sont app-private dans External Storage (GT) ?

Si vous gérez des fichiers qui ne sont pas destinés à d'autres applications (par exemple, des textures graphiques ou des effets sonores utilisés uniquement par votre application), vous devez utiliser un répertoire de stockage privé sur le stockage externe.

Depuis Android 4.4, la lecture ou l'écriture de fichiers dans les répertoires privés de votre application ne nécessite pas les autorisations READ_EXTERNAL_STORAGE ou WRITE_EXTERNAL_STORAGE . Vous pouvez donc déclarer que l'autorisation doit être demandée uniquement sur les versions inférieures d'Android en ajoutant l'attribut maxSdkVersion :

<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                     android:maxSdkVersion="18" />
    ...
</manifest

Méthodes à stocker dans le stockage interne (GT):

Ces deux méthodes sont présentes dans la classe Context

File getDir (String name, int mode)

File getFilesDir () 

Méthodes à stocker dans le stockage externe primaire, c'est-à-dire le stockage interne (UT):

File getExternalStorageDirectory ()

File getExternalFilesDir (String type)

File getExternalStoragePublicDirectory (String type)

Au début, tout le monde utilisait Environment.getExternalStorageDirectory () , qui indiquait la racine du stockage externe primaire . En conséquence, le stockage externe principal était rempli de contenu aléatoire.

Plus tard, ces deux méthodes ont été ajoutées:

  1. Dans la classe Context , ils ont ajouté getExternalFilesDir () , pointant vers un répertoire spécifique à l' application sur le stockage externe principal. Ce répertoire et son contenu seront supprimés lors de la désinstallation de l'application.

  2. Environment.getExternalStoragePublicDirectory () pour les emplacements centralisés permettant de stocker des types de fichiers connus, tels que des photos et des films. Ce répertoire et son contenu ne seront PAS supprimés lors de la désinstallation de l'application.

Méthodes de stockage dans le stockage amovible (GT), c.-à-d. Carte micro SD

Avant le niveau 19 de l'API , il n'y avait pas de moyen officiel de stocker sur une carte SD. Mais, beaucoup pourraient le faire en utilisant des bibliothèques non officielles ou des API.

Officiellement, une méthode a été introduite dans la classe Context au niveau 19 de l’API (Android version 4.4 - Kitkat).

File[] getExternalFilesDirs (String type)

Il renvoie des chemins d'accès absolus aux répertoires spécifiques à l'application sur tous les périphériques de stockage partagés / externes sur lesquels l'application peut placer des fichiers persistants qu'elle possède. Ces fichiers sont internes à l'application et ne sont généralement pas visibles par l'utilisateur en tant que support.

Cela signifie qu'il renverra des chemins vers les deux types de stockage externe (GT) - mémoire interne et carte micro SD. Généralement, le deuxième chemin serait le chemin de stockage de la carte micro SD (mais pas toujours). Vous devez donc le vérifier en exécutant le code avec cette méthode.

Exemple avec l'extrait de code:

J'ai créé un nouveau projet Android avec une activité vide, écrit le code suivant à l'intérieur

protected void onCreate(Bundle savedInstanceState) de MainActivity.java

    File internal_m1 = getDir("custom", 0);
    File internal_m2 = getFilesDir();

    File external_m1 =  Environment.getExternalStorageDirectory();
    
    File external_m2 =  getExternalFilesDir(null);
    File external_m2_Args = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

    File external_m3 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    
    File[] external_AND_removable_storage_m1 = getExternalFilesDirs(null);
    File[] external_AND_removable_storage_m1_Args = getExternalFilesDirs(Environment.DIRECTORY_PICTURES);

Après avoir exécuté le code ci-dessus,

Sortie:

internal_m1: /data/data/your.application.package.appname/app_custom

internal_m2: /data/data/your.application.package.appname/files

external_m1: /storage/emulated/0

external_m2: /storage/emulated/0/Android/data/your.application.package.appname/files

external_m2_Args: /storage/emulated/0/Android/data/your.application.package.appname/files/Pictures

external_m3: /storage/emulated/0/Pictures

external_AND_removable_storage_m1 (first path):
/storage/emulated/0/Android/data/your.application.package.appname/files

external_AND_removable_storage_m1 (second path):    
/storage/sdcard1/Android/data/your.application.package.appname/files

 external_AND_removable_storage_m1_Args (first path):
/storage/emulated/0/Android/data/your.application.package.appname/files/Pictures

external_AND_removable_storage_m1_Args (second path): /storage/sdcard1/Android/data/your.application.package.appname/files/Pictures

Remarque: J'ai connecté mon téléphone à un PC Windows; activé les deux options de développeur, le débogage USB et ensuite exécuté ce code. Si vous ne connectez pas votre téléphone mais au lieu de cela exécuter sur l' émulateur Android , votre sortie peut varier. Mon modèle de téléphone est Coolpad Note 3 - fonctionnant sur Android 5.1

Emplacements de stockage sur mon téléphone:

Emplacement de stockage Micro SD : /storage/sdcard1

Emplacement de stockage interne (UT) : /storage/sdcard0 .

Notez que /sdcard & /storage/emulated/0 pointe également vers le stockage interne (UT). Mais ce sont des liens symboliques vers /storage/sdcard0 .

Pour bien comprendre les différents chemins de stockage sous Android, veuillez parcourir cette réponse

Disclaimer: Tous les chemins de stockage mentionnés ci-dessus sont des chemins sur mon téléphone. Vos fichiers ne peuvent pas être stockés sur les mêmes chemins de stockage. Parce que les emplacements de stockage / chemins peuvent varier sur les autres téléphones mobiles en fonction de votre fournisseur, du fabricant et des différentes versions du système d'exploitation Android.