Cependant, quand je vérifie si le fichier a été copié avec succès, le fichier est créé même pas dans la carte SD.
Vous n'avez pas accès arbitraire au niveau du système de fichiers à removable storage sur Android 4.4+.
Y a-t-il une solution pour cela?
Cela dépend de votre objectif.
Si vous insistez sur le fait que vous devez pouvoir écrire sur ce chemin spécifique sur des machines utilisateur arbitraires ... alors, non, il n'existe aucune solution de contournement prise en charge. Après tout, il n'y a pas /storage/external_SD
sur la grande majorité des appareils Android. Où et comment les fabricants de périphériques choisissent de monter un support amovible est à leur disposition et est un détail d'implémentation qui peut varier.
Si vous relâchez cette restriction, mais insistez sur le fait que vous devez pouvoir écrire un fichier dans le répertoire racine du stockage amovible sur des machines utilisateur arbitraires ... alors non, il n'existe aucune solution de contournement prise en charge. L'aperçu N Developer a une fonctionnalité "Scoped Directory Access" qui devrait permettre cela, mais il faudra plusieurs années avant de pouvoir supposer qu'un appareil utilisateur arbitraire utilisera cette version d'Android ou plus. En outre, vous n'obtenez pas l'accès réel au système de fichiers, mais plutôt un Uri
(voir l'option Storage Access Framework, ci-dessous).
Maintenant, si vous êtes plus flexible sur l'emplacement précis, vous avez d'autres options:
Vous pouvez utiliser getExternalFilesDirs()
, getExternalCacheDirs()
et getExternalMediaDirs()
, de toutes les méthodes Context
. Notez le pluriel. Si ceux-ci renvoient 2+ entrées, la seconde et les suivantes sont des emplacements sur le stockage amovible que vous pouvez lire et écrire, aucune autorisation n'est requise. Cependant, vous n'avez pas à choisir le chemin exact. Et si l'appareil a 2+ volumes de stockage amovibles, je ne suis pas certain de la façon dont vous aideriez l'utilisateur à les différencier.
Vous pouvez utiliser Storage Access Framework et laisser l'utilisateur choisir où placer le fichier. L'utilisateur est invité à choisir le stockage amovible ... ou non. Vous obtenez un Uri
retour, que vous pouvez utiliser avec ContentResolver
et openOutputStream()
pour écrire votre contenu.Vous pouvez également prendre des autorisations persistantes Uri
afin de pouvoir réutiliser ce fichier à l'avenir, en supposant que l'utilisateur ne le déplace pas ou ne le supprime pas derrière votre dos.
pouvez partager le code de copyFile vous? et faites mkdirs() qui va aussi créer des répertoires intermédiaires. – dex
Vous n'avez pas accès arbitraire au niveau du système de fichiers à [stockage amovible] (https://commonsware.com/blog/2014/04/09/storage-situation-removable-storage.html) sur Android 4.4+. – CommonsWare
@dex, j'ai édité pour ajouter un lien. Aussi, j'ai fait un mkdir. Regarde mon code. –