No se puede crear un directorio en / sdcard

He estado intentando crear un directorio en /sdcard progtwigción, pero no está funcionando. El siguiente código siempre muestra el directory not created.

 boolean success = (new File("/sdcard/map")).mkdir(); if (!success) { Log.i("directory not created", "directory not created"); } else { Log.i("directory created", "directory created"); } 

Hay tres cosas a considerar aquí:

  1. No asum que la tarjeta sd está montada en /sdcard (puede ser cierto en el caso predeterminado, pero mejor no en el código duro). Puede obtener la ubicación de la tarjeta SD consultando el sistema:

     Environment.getExternalStorageDirectory(); 
  2. Debe informar a Android que su aplicación necesita escribir en el almacenamiento externo agregando una entrada de permisos de uso en el archivo AndroidManifest.xml :

      
  3. Si este directorio ya existe, entonces mkdir va a devolver falso. Por lo tanto, verifique la existencia del directorio y luego intente crearlo si no existe. En su componente, use algo como:

     File folder = new File(Environment.getExternalStorageDirectory() + "/map"); boolean success = true; if (!folder.exists()) { success = folder.mkdir(); } if (success) { // Do something on success } else { // Do something else on failure } 

Tuve el mismo problema después de actualizar mi teléfono Android a 6.0 (API nivel 23). La siguiente solución funciona en mí. Espero que te ayude también.

Por favor revisa tu versión de Android. Si es> = 6.0 (nivel API 23), necesita no solo incluir

  

en su AndroidManifest.xml, pero también solicite permiso antes de llamar a mkdir () . Code snopshot.

 public static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1; public int mkFolder(String folderName){ // make a folder under Environment.DIRECTORY_DCIM String state = Environment.getExternalStorageState(); if (!Environment.MEDIA_MOUNTED.equals(state)){ Log.d("myAppName", "Error: external storage is unavailable"); return 0; } if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { Log.d("myAppName", "Error: external storage is read only."); return 0; } Log.d("myAppName", "External storage is not read only or unavailable"); if (ContextCompat.checkSelfPermission(this, // request permission when it is not granted. Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { Log.d("myAppName", "permission:WRITE_EXTERNAL_STORAGE: NOT granted!"); // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),folderName); int result = 0; if (folder.exists()) { Log.d("myAppName","folder exist:"+folder.toString()); result = 2; // folder exist }else{ try { if (folder.mkdir()) { Log.d("myAppName", "folder created:" + folder.toString()); result = 1; // folder created } else { Log.d("myAppName", "creat folder fails:" + folder.toString()); result = 0; // creat folder fails } }catch (Exception ecp){ ecp.printStackTrace(); } } return result; } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'case' lines to check for other // permissions this app might request } } 

Para obtener más información, lea ” Solicitud de permisos en tiempo de ejecución ”

Reinicia tu dispositivo Android. Las cosas comenzaron a funcionar para mí después de reiniciar el dispositivo.

El camino correcto a la tarjeta sd es

 /mnt/sdcard/ 

pero, como se contestó anteriormente, no debe codificarlo. Si tiene Android 2.1 o posterior, use

 getExternalFilesDir(String type) 

De otra manera:

 Environment.getExternalStorageDirectory() 

Lea detenidamente https://developer.android.com/guide/topics/data/data-storage.html#filesExternal

Además, necesitarás usar este método o algo similar

 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; } 

luego verifica si puedes acceder a la tarjeta sd. Como se dijo, lea la documentación oficial.

Otra opción, quizás necesites usar mkdirs en lugar de mkdir

 file.mkdirs() 

Crea el directorio nombrado por el nombre de archivo posterior de este archivo, incluida la ruta completa del directorio requerida para crear este directorio.

Si esto te sucede con Android 6 y comstack objective> = 23, no olvides que ahora estamos usando permisos de tiempo de ejecución . Entonces, dar permisos en el manifiesto ya no es suficiente.

use mkdirs () en lugar de mkdir () … funcionó para mí 🙂

 File folder = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA"); if(!folder.exists()){ if(folder.mkdirs()) Toast.makeText(this, "New Folder Created", Toast.LENGTH_SHORT).show(); } File sdCardFile = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA/cgpa.html"); 

en api para Android> = 23

   

en lugar de

   

¿Tiene los permisos adecuados para escribir en la tarjeta SD en su manifiesto? Busque WRITE_EXTERNAL_STORAGE en http://developer.android.com/reference/android/Manifest.permission.html

¿No está ya creado? Mkdir devuelve falso si la carpeta ya existe también mkdir

Hay muchas cosas de las que debe preocuparse 1.Si está usando Android Bellow Marshmallow, debe establecer las permeabilidades en el archivo de manifiesto. 2. Si está utilizando versiones posteriores de Android significa ahora de Marshmallow a Oreo. O bien tiene que ir a la Información de la aplicación y Establecer allí manualmente el permiso de la aplicación para Almacenamiento. si quieres configurarlo en tiempo de ejecución puedes hacerlo por debajo del código

 public boolean isStoragePermissionGranted() { if (Build.VERSION.SDK_INT >= 23) { if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { Log.v(TAG,"Permission is granted"); return true; } else { Log.v(TAG,"Permission is revoked"); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); return false; } } else { //permission is automatically granted on sdk<23 upon installation Log.v(TAG,"Permission is granted"); return true; } 

}

 File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/FoderName"); if (!f.exists()) { f.mkdirs(); } 

Cometí el error de incluir ambos:

  

y:

  

en el orden de arriba Entonces cuando saqué el segundo permiso, (LEER), el problema desapareció.