Comment créer un répertoire automatiquement sur la carte SD

J’essaie d’enregistrer mon fichier à l’emplacement suivant
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); mais je reçois l’exception java.io.FileNotFoundException
Cependant, lorsque je mets le chemin sous "/sdcard/" cela fonctionne.

Maintenant, je suppose que je ne peux pas créer de répertoire automatiquement de cette façon.

Quelqu’un peut-il suggérer comment créer un directory and sub-directory utilisant du code?

Si vous créez un object File qui encapsule le répertoire de niveau supérieur, vous pouvez appeler sa méthode mkdirs () pour générer tous les répertoires nécessaires. Quelque chose comme:

 // create a File object for the parent directory File wallpaperDirectory = new File("/sdcard/Wallpaper/"); // have the object build the directory structure, if needed. wallpaperDirectory.mkdirs(); // create a File object for the output file File outputFile = new File(wallpaperDirectory, filename); // now attach the OutputStream to the file object, instead of a Ssortingng representation FileOutputStream fos = new FileOutputStream(outputFile); 

Remarque: Il peut être judicieux d’utiliser Environment.getExternalStorageDirectory () pour obtenir le répertoire “SD Card”, car cela peut changer si un téléphone est fourni avec une carte SD (flash intégré, par exemple). iPhone). Quoi qu’il en soit, vous devez garder à l’esprit que vous devez vérifier que la carte SD peut être retirée.

MISE À JOUR: Depuis l’API niveau 4 (1.6), vous devrez également demander l’autorisation. Quelque chose comme ça (dans le manifeste) devrait fonctionner:

  

A eu le même problème et je veux juste append que AndroidManifest.xml a également besoin de cette autorisation:

  

Voici ce qui fonctionne pour moi.

  uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 

dans votre manifeste et le code ci-dessous

 public static boolean createDirIfNotExists(Ssortingng path) { boolean ret = true; File file = new File(Environment.getExternalStorageDirectory(), path); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); ret = false; } } return ret; } 

En fait, j’ai utilisé une partie de @fiXedd asnwer et cela a fonctionné pour moi:

  //Create Folder File folder = new File(Environment.getExternalStorageDirectory().toSsortingng()+"/Aqeel/Images"); folder.mkdirs(); //Save the path as a ssortingng value Ssortingng extStorageDirectory = folder.toSsortingng(); //Create New file and name it Image2.PNG File file = new File(extStorageDirectory, "Image2.PNG"); 

Assurez-vous que vous utilisez mkdirs () et non mkdir () pour créer le chemin complet

Avec l’API 8 et les versions ultérieures, l’emplacement de la carte SD a changé. La réponse de @ fiXedd est bonne, mais pour un code plus sûr, vous devriez utiliser Environment.getExternalStorageState() pour vérifier si le média est disponible. Vous pouvez ensuite utiliser getExternalFilesDir() pour accéder au répertoire souhaité (en supposant que vous utilisez l’API 8 ou une version getExternalFilesDir() ).

Vous pouvez en lire plus dans la documentation du SDK .

Assurez-vous que le stockage externe est présent: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

 private boolean isExternalStoragePresent() { boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; Ssortingng state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { // Something else is wrong. It may be one of many other states, but // all we need // to know is we can neither read nor write mExternalStorageAvailable = mExternalStorageWriteable = false; } if (!((mExternalStorageAvailable) && (mExternalStorageWriteable))) { Toast.makeText(context, "SD card not present", Toast.LENGTH_LONG) .show(); } return (mExternalStorageAvailable) && (mExternalStorageWriteable); } 

J’ai rencontré le même problème. Il existe deux types d’permissions sous Android:

  • Dangereux (access aux contacts, écriture sur stockage externe …)
  • Normal (les permissions normales sont automatiquement approuvées par Android, tandis que les permissions dangereuses doivent être approuvées par les utilisateurs Android).

Voici la stratégie pour obtenir des permissions dangereuses dans Android 6.0

  • Vérifiez si vous avez la permission accordée
  • Si votre application dispose déjà de l’autorisation, continuez et exécutez normalement.
  • Si votre application ne dispose pas encore de l’autorisation, demandez à l’utilisateur d’approuver
  • Écouter l’approbation de l’utilisateur dans onRequestPermissionsResult

Voici mon cas: je dois écrire sur un stockage externe.

Tout d’abord, je vérifie si j’ai la permission:

 ... private static final int REQUEST_WRITE_STORAGE = 112; ... boolean hasPermission = (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED); if (!hasPermission) { ActivityCompat.requestPermissions(parentActivity, new Ssortingng[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE); } 

Ensuite, vérifiez l’approbation de l’utilisateur:

 @Override public void onRequestPermissionsResult(int requestCode, Ssortingng[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_WRITE_STORAGE: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //reload my activity with permission granted or use the features what required the permission } else { Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show(); } } } } 

J’étais confronté au même problème, incapable de créer un répertoire sur le Galaxy S, mais j’ai pu le créer avec succès sur Nexus et Samsung Droid. Comment j’ai résolu le problème en ajoutant la ligne de code suivante:

 File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/"); dir.mkdirs(); 

N’oubliez pas de vous assurer qu’il n’y a pas de caractères spéciaux dans vos noms de fichiers / dossiers. Arrivé à moi avec “:” lorsque je définissais des noms de dossiers en utilisant des variables

caractères non autorisés dans les noms de fichiers / dossiers

“* /: <>? \ |

U peut trouver ce code utile dans un tel cas.

Le code ci-dessous supprime tous les “:” et les remplace par “-”

 //actualFileName = "qwerty:asdfg:zxcvb" say... Ssortingng[] tempFileNames; Ssortingng tempFileName =""; Ssortingng delimiter = ":"; tempFileNames = actualFileName.split(delimiter); tempFileName = tempFileNames[0]; for (int j = 1; j < tempFileNames.length; j++){ tempFileName = tempFileName+" - "+tempFileNames[j]; } File file = new File(Environment.getExternalStorageDirectory(), "/MyApp/"+ tempFileName+ "/"); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); } } 
 File sdcard = Environment.getExternalStorageDirectory(); File f=new File(sdcard+"/dor"); f.mkdir(); 

Cela créera un dossier nommé dor dans votre carte SD. puis pour extraire le fichier pour eg-filename.json qui est manuellement inséré dans le dossier dor . Comme:

  File file1 = new File(sdcard,"/dor/fitness.json"); ....... ..... 

et n’oubliez pas d’append du code dans le manifeste

  //Create File object for Parent Directory File wallpaperDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "wallpaper"); if (!wallpaperDir.exists()) { wallpaperDir.mkdir(); } File out = new File(wallpaperDir, wallpaperfile); FileOutputStream outputStream = new FileOutputStream(out); 

Je viens de terminer le post du Vijay …


Manifeste

 uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 

Fonction

 public static boolean createDirIfNotExists(Ssortingng path) { boolean ret = true; File file = new File(Environment.getExternalStorageDirectory(), path); if (!file.exists()) { if (!file.mkdirs()) { Log.e("TravellerLog :: ", "Problem creating Image folder"); ret = false; } } return ret; } 

Usage

 createDirIfNotExists("mydir/"); //Create a directory sdcard/mydir createDirIfNotExists("mydir/myfile") //Create a directory and a file in sdcard/mydir/myfile.txt 

Vous pouvez vérifier les erreurs

 if(createDirIfNotExists("mydir/")){ //Directory Created Success } else{ //Error } 

Cela fera un dossier dans sdcard avec le nom du dossier que vous fournissez.

 File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name"); if (!file.exists()) { file.mkdirs(); } 

Vous pouvez utiliser / sdcard / au lieu de Environment.getExternalStorageDirectory ()

 private static Ssortingng DB_PATH = "/sdcard/Android/data/com.myawesomeapp.app/"; File dbdir = new File(DB_PATH); dbdir.mkdirs(); 
 ivmage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent i = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE_ADD); } });`