Cómo crear directorio automáticamente en tarjeta SD

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

Ahora estoy asumiendo que no soy capaz de crear directorio automáticamente de esta manera.

¿Puede alguien 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 llamar al método mkdirs () para crear 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: Podría ser aconsejable usar Environment.getExternalStorageDirectory () para obtener el directorio "Tarjeta SD", ya que esto podría cambiar si aparece un teléfono que tiene algo distinto de una tarjeta SD (como flash incorporado, IPhone). De cualquier manera, debe tener en cuenta que debe comprobar para asegurarse de que realmente está allí como la tarjeta SD puede ser eliminado.

ACTUALIZACIÓN: Desde el Nivel 4 de API (1.6) también tendrá que solicitar el permiso. Algo así (en el manifiesto) debería funcionar:

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

Tenía el mismo problema y sólo quería añadir que AndroidManifest.xml también necesita este permiso:

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

Esto es lo que funciona para mí.

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

En su manifiesto y el código abajo

 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 usé 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 que está utilizando mkdirs () no mkdir () para crear la ruta completa

Con la API 8 y superior, la ubicación de la tarjeta SD ha cambiado. @ La respuesta de fiXedd es buena, pero para un código más seguro, debes usar Environment.getExternalStorageState() para comprobar si el medio está disponible. A continuación, puede utilizar getExternalFilesDir() para navegar hasta el 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).

Esta es la estrategia para obtener permisos peligrosos en Android 6.0

  • Compruebe si tiene el permiso concedido
  • Si ya se ha concedido el permiso a su aplicación, continúe y realice normalmente.
  • Si su aplicación aún no tiene el permiso, pida al usuario que apruebe
  • Escucha la aprobación del usuario en onRequestPermissionsResult

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

En primer lugar, compruebo 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); } 

A continuación, compruebe 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(); } } } } 

Yo estaba enfrentando el mismo problema, incapaz de crear el directorio en Galaxy S, pero fue capaz de crear con éxito en Nexus y Samsung Droid. Cómo lo fijé era agregando la línea siguiente del código:

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

No olvide asegurarse de que no tiene caracteres especiales en sus nombres de archivo / carpeta. Me sucedió con ":" cuando estaba estableciendo nombres de carpeta usando variables (s)

Caracteres no permitidos en los nombres de archivo / carpeta

Unesdoc.unesco.org unesdoc.unesco.org

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

El siguiente código elimina todos los ":" 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 su sdcard. A continuación, para buscar el archivo de eg- filename.json que se inserta manualmente en la carpeta dor . Me gusta:

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

<Uses-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />

Y no olvide añadir código en el 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); 

Completando el puesto 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 comprobar si hay errores

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

Esto hará que la carpeta en sdcard con nombre de carpeta que usted proporciona.

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

Puede utilizar / 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); } });` 
  • Cómo calcular el tamaño de un archivo en Android
  • ¿Algún modo de aumentar el tamaño del archivo de registro del sistema Android?
  • ¿Cómo leer el archivo de texto de los números de flotación de manera eficiente con Java + LibGDX?
  • Android - ¿Cómo puedo guardar un archivo legible por otra aplicación?
  • Cómo hacer referencia a un archivo en carpeta sin procesar en Android
  • Creación de un archivo zip con algunos archivos en SDCard
  • LibGDX no puede cargar una imagen específica
  • Intentando crear un archivo en Android: open failed: EROFS (Sistema de archivos de sólo lectura)
  • Cómo guardar archivos en el directorio público de almacenamiento externo DOCUMENTS en Android 4.1.2
  • ¿Por qué no se puede mostrar la carpeta "datos" como en el explorador de archivos DDMS?
  • Cómo guardar las fotos tomadas en una carpeta específica?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.