1

J'essaie de copier un fichier qui se trouve dans le répertoire de stockage externe dans un répertoire qui se trouve dans ma carte SD. Toutefois, lorsque je vérifie pour voir si le fichier a été copié avec succès, le fichier n'est même pas créé dans la carte SD.Le fichier Android n'est pas copié sur la carte SD

Ai-je raté quelque chose? Voici le code que j'ai:

String sourcePath = Environment.getExternalStorageDirectory().getPath() + newFileName; 

File source = new File(Environment.getExternalStorageDirectory().getPath(), newFileName); 
String destinationPath = "/storage/external_SD"; 
File destination = new File(destinationPath, newFileName); 
try { 
    if(!destination.exists()){ 
     destination.mkdir(); 
    } 
    FileUtils.copyFile(source, destination); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

La méthode copyFile est d'une bibliothèque Apache. Voici le lien pour cela: https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html

+0

pouvez partager le code de copyFile vous? et faites mkdirs() qui va aussi créer des répertoires intermédiaires. – dex

+0

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

+0

@dex, j'ai édité pour ajouter un lien. Aussi, j'ai fait un mkdir. Regarde mon code. –

Répondre

2

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.

1

Le destinationPath que vous avez mentionné peut ne pas être accessible car il peut appartenir aux dossiers système privés ou à d'autres dossiers d'applications. Vous pouvez cependant utiliser des dossiers publics comme Images, Musique, Vidéos, Téléchargements, etc. ou créer des sous-dossiers dans les -

String sourcePath = Environment.getExternalStorageDirectory().getPath() + newFileName; 

    File source = new File(Environment.getExternalStorageDirectory().getPath(), newFileName); 
File destinationPath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS, "/external_SD");  

    try { 
     if(!destinationPath.exists()){ 
      destinationPath.mkdir(); 
     } 
File destination = new File(destinationPath, newFileName); 
     FileUtils.copyFile(source, destination); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

qui n'a pas fonctionné –

+0

Est-ce que même le dossier "external_SD" créé en externe SD? –

+0

Non, il n'est pas créé –

1

Si vous souhaitez copier vers un stockage externe, vous devez

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

Je l'ai déjà dans mon manifeste –