La classe Environment sous Android
La classe File sous Android est identique à la Classe File de JAVA.
Cependant, quelques informations spécifiques au système peuvent nous être utiles:
Récupérer le répertoire de l'application, le répertoire de téléchargements ou encore le nom du volume utilisé pour la carte micros SD.
Toutes ces informations peuvent être récupérées grâce à la classe Environment:
- Répertoire de l'application : getFilesDir()
- Répertoire de données : static File Environment.getDataDirectory()
- Répertoire des téléchargements : static File Environment.getDownloadCacheDirectory()
- Répertoire racine d'Android : on l'obtient par static File Environment.getRootDirectory()
Récupérer les répertoires plus spécifiques, dédiés
à l'utilisateur (il s'agit des répertoires utilisés pour
le ringTone, images, ...) vous utiliserez la méthode static File getExternalStoragePublicDirectory(String
type) pour connaître le répertoire public conseillé ou
getExternalFilesDir(String type) (Attention ce répertoire étant
effacé lors de la
désinstallation de l'application);
où type est une constante qui prendra une des valeurs suivantes:
DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES, DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_DOWNLOADS, or DIRECTORY_DCIM.
Voir aussi abstract
File getDir(String name, int mode), public abstract File getCacheDir () et abstract
File getExternalCacheDir()
Récupérer le nom du volume utilisé pour la première
untité de stockage externe (généralement la carte SD, mais
il peut aussi s'agir d'un montage d'un volume Unix sur la mémoire interne
de l'appareil autre que celui réservé au système. Dans
ce cas, nous sommes en présence de multiples
unités de stockage externe): Environment.getExternalStorageDirectory()
Cette information pourra (je devrais dire "doit" dans le cas où
vous voulez y accéder) être complétée des informations
indiquant l'état de l'unité externe (il s'agit de constantes)
via la méthode Environment.getExternalStorageState():
(il s'agit d'une vision de volumes correspondant à un système UNIX - Normal, puisque Linux derrière tout ça)
MEDIA_BAD_REMOVAL pour volume défait physiquement alors que le système
ne l'avait par encore démonté.
MEDIA_CHECKING pour un volume monté est marqué comme validé.
MEDIA_MOUNTED pour un volume monté par le système
MEDIA_MOUNTED_READ_ONLY pour un volume monté en lecture seule.
MEDIA_NOFS pour un volume non formaté ou file system non reconnu.
MEDIA_REMOVED pour un volume démonté physiquement.
MEDIA_SHARED pour un volume présent, mais non utilisable pour le moment
(par exemple lorsque vous accéder à la carte SD via votre PC).
MEDIA_UNMOUNTABLE pour un volume présent, mais non montable car altéré.
MEDIA_UNMOUNTED pour un volume présent physiquement, mais où le
montage n'est pas encore fait au niveau du système.
Un exemple d'utilisation dans un code permettant de lancer une intention
implicite afin de lire un fichier MP3
sur la SDCard à partir du lecteur de média de l'appareil.
Autorisation sur les supports externes
Pour pouvoir accéder en écriture à la ressource de stockage
externe, il faut avoir les autorisations ! Donc dans le fichier AndroidManifest.xml,
il faut ajouter:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> directement sous la balise <manifest>
sinon, vous obtiendrez un beau message d'exception:
java.io.FileNotFoundException: /mnt/sdcard/nom_du_fichier_avec_eventuels_repertoires (Permission denied)
De même, dans l'émulateur (AVD), vérifiez que vous avez installé une carte SD, ou encore que la carte n'est pas actuellement verrouillée suite à une connexion PC. Bref contrôlez bien tout cela dans votre code avec Environment.getExternalStorageState() avant de faire une tentative d'écriture !
Depuis Android
4.1, la lecture est aussi protégée. Il faudra utiliser la permission
READ_EXTERNAL_STORAGE
Avec
Android 4.4, cela se complique encore...
Mutiples ressources de stockage externe
Pour récupérer les différentes ressources de stockage externe, vous pouvez par exemple utiliser la méthode getExternalFilesDirs() de la classe Context. On sort de la classe Environment !
Type de support externe
Android peut émuler un support externe. Pour savoir si le support est émulé ou non, vous pouvez utiliser les méthodes:
public static boolean isExternalStorageEmulated() pour un support émulé
public static boolean isExternalStorageRemovable () pour une carte SD par exemple, mais aussi clef usb, ...
A partir de l'API 21, ces méthodes peuvent recevoir un chemin en paramètre:
public static boolean isExternalStorageEmulated (File path)
public static boolean isExternalStorageRemovable (File path)
Google est les cartes SD...
Google n'a jamais
vraiment aimé la présence de micro SD dans les smartphones. Ceci est certainement
lié (comme chez Apple) à une préférence pour un usage de son cloud, permettant
de récupérer vos données perso. en passant.
Depuis Kitkat, et sous prétexte de sécurité, Google va plus loin en considérant qu'une application ne peut plus écrire n'importe où sur les ressources externes secondaires, qui sera souvent la carte SD ! Pour une application non système, seule sera autorisée la première ressource de stockage externe qui sera généralement la mémoire interne qui est bien vite saturée (ou qu'il faut vite saturer ?), avec éventuellement une permission préalable. Cela peut donc poser des problèmes si votre application tente d'écrire sur la carte SD ! Je trouve ce choix fort discutable, si encore ils avaient laissé le choix à l'utilisateur !
Il sera cependant autorisé pour une application d'accéder librement à un répertoire sur la carte SD et ceci sans avoir à poser une permission. Il s'agit d'un répertoire, équivalent à celui utilisé pour les données pour la mémoire interne, donc sous Android/data/ suivi du nom du package de l'application.
Les
fichiers présents dans le répertoire correspondant au package
de l'application sous Android/data seront effacés si vous désinstallez
cette application, pensez
à sauver vos fichiers de sauvegarde qui si trouverez avant de supprimer
cette application !
cf. http://source.android.com/devices/tech/storage/
Pour remettre les autorisations permettant d'accéder à la carte SD en écriture n'importe où sur votre appareil, voyez la solution proposée ici (hors dev). Cela devrait aider les gestionnaires de fichiers à refonctionner comme il faut !