Cómo crear un directorio automáticamente en la tarjeta SD

Estoy tratando de guardar mi archivo en la siguiente ubicación
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName); pero java.io.FileNotFoundException la excepción java.io.FileNotFoundException
Sin embargo, cuando pongo el camino como "/sdcard/" funciona.

Ahora supongo que no puedo crear el directorio automáticamente de esta manera.

¿Alguien puede sugerir cómo crear un directory and sub-directory usando código?

Si crea un objeto File que envuelve el directorio de nivel superior, puede llamarlo al método mkdirs () para comstackr todos los directorios necesarios. Algo como:

 // 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 String representation FileOutputStream fos = new FileOutputStream(outputFile); 

Nota: Puede ser conveniente usar Environment.getExternalStorageDirectory () para obtener el directorio “Tarjeta SD”, ya que esto podría cambiar si llega un teléfono que tiene algo más que una tarjeta SD (como flash incorporado, a’la the iPhone). De cualquier manera, debes tener en cuenta que debes verificar que esté realmente allí ya que la tarjeta SD puede ser removida.

ACTUALIZACIÓN: desde API Nivel 4 (1.6) también tendrás que solicitar el permiso. Algo como esto (en el manifiesto) debería funcionar:

  

Tuve el mismo problema y solo quiero agregar que AndroidManifest.xml también necesita este permiso:

  

Esto es lo que funciona para mí.

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

en su manifiesto y el código a continuación

 public static boolean createDirIfNotExists(String 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 realidad, utilicé parte de @fiXedd asnwer y funcionó para mí:

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

Asegúrese de estar utilizando mkdirs () not mkdir () para crear la ruta completa

Con API 8 y superior, la ubicación de la tarjeta SD ha cambiado. La respuesta de @ fiXedd es buena, pero para obtener un código más seguro, debe usar Environment.getExternalStorageState() para verificar si el medio está disponible. Luego puede usar getExternalFilesDir() para navegar al directorio que desee (suponiendo que esté utilizando API 8 o superior).

Puede leer más en la documentación del SDK .

Asegúrese de que el almacenamiento externo esté presente: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

 private boolean isExternalStoragePresent() { boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; String 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); } 

Me enfrenté al mismo problema. Hay dos tipos de permisos en Android:

  • Peligroso (acceso a contactos, escritura en almacenamiento externo …)
  • Normal (los permisos normales son aprobados automáticamente por Android, mientras que los permisos peligrosos deben ser aprobados por los usuarios de Android).

Aquí está la estrategia para obtener permisos peligrosos en Android 6.0

  • Compruebe si tiene el permiso otorgado
  • Si su aplicación ya cuenta con el permiso, siga adelante y realice su trabajo normalmente.
  • Si su aplicación aún no cuenta con el permiso, solicite que el usuario apruebe
  • Escuchar la aprobación del usuario en onRequestPermissionsResult

Aquí está mi caso: necesito escribir en el almacenamiento externo.

Primero, verifico si tengo el permiso:

 ... 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 String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE); } 

Luego verifique la aprobación del usuario:

 @Override public void onRequestPermissionsResult(int requestCode, String[] 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(); } } } } 

Estaba enfrentando el mismo problema, no pude crear un directorio en Galaxy S pero pude crearlo con éxito en Nexus y Samsung Droid. Cómo lo arreglé fue agregando la siguiente línea de código:

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

No olvides asegurarte de que no tienes caracteres especiales en tus nombres de archivo / carpeta. Me sucedió con “:” cuando estaba configurando nombres de carpeta usando variable (s)

caracteres no permitidos en nombres de archivo / carpeta

“* /: <>? \ |

U puede encontrar este código útil en tal caso.

El código a continuación elimina todo “:” y los reemplaza con “-”

 //actualFileName = "qwerty:asdfg:zxcvb" say... String[] tempFileNames; String tempFileName =""; String 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(); 

esto creará una carpeta llamada dor en tu tarjeta sd. luego, busque el archivo para eg- filename.json que se inserta manualmente en la carpeta dor . Me gusta:

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

y no te olvides de agregar el código en manifiesto

  //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); 

Solo completando la publicación de Vijay …


Manifiesto

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

Función

 public static boolean createDirIfNotExists(String 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; } 

Uso

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

Puede verificar si hay errores

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

Esto hará que la carpeta en la tarjeta SD con el nombre de la carpeta que proporcione.

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

Puede usar / sdcard / en lugar de Environment.getExternalStorageDirectory ()

 private static String 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); } });`