La creación de directorios no funciona en Marshmallow Android

Estoy creando un directorio en mi aplicación nativa. Está funcionando perfectamente en Android 5.0, pero en Android 6.0 (Marshmallow) algunas veces funcionó y otras veces no. Estoy usando el siguiente código para crear un nuevo directorio. Estoy guardando el archivo de video y de imagen. en el directorio.

public static void createApplicationFolder() { File f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME); f.mkdirs(); f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME + Config.VIDEO_COMPRESSOR_COMPRESSED_VIDEOS_DIR); f.mkdirs(); f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME + Config.VIDEO_COMPRESSOR_TEMP_DIR); f.mkdirs(); } 

 public class MyDevIDS extends AppCompatActivity { private static final int REQUEST_RUNTIME_PERMISSION = 123; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (CheckPermission(MyDevIDS.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // you have permission go ahead createApplicationFolder(); } else { // you do not have permission go request runtime permissions RequestPermission(MyDevIDS.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_RUNTIME_PERMISSION); } } @Override public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) { switch (permsRequestCode) { case REQUEST_RUNTIME_PERMISSION: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // you have permission go ahead createApplicationFolder(); } else { // you do not have permission show toast. } return; } } } public void RequestPermission(Activity thisActivity, String Permission, int Code) { if (ContextCompat.checkSelfPermission(thisActivity, Permission) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Permission)) { } else { ActivityCompat.requestPermissions(thisActivity, new String[]{Permission}, Code); } } } public boolean CheckPermission(Context context, String Permission) { if (ContextCompat.checkSelfPermission(context, Permission) == PackageManager.PERMISSION_GRANTED) { return true; } else { return false; } } } 

Los dispositivos que se ejecutan en Android M no pueden escribir datos directamente en el almacenamiento. necesitas pedir permiso para eso.

este enlace puede ser útil

Por lo WRITE_EXTERNAL_STORAGE debe solicitar el permiso WRITE_EXTERNAL_STORAGE en tiempo de ejecución aquí.

 public boolean permissions() { //cheeck id device is Android M if (Build.VERSION.SDK_INT >= 23) { if(checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { //your permission is granted return true; } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); return false; } } else { //permission is automatically granted on devices lower than android M upon installation return true; } } 

También deberá sobrescribir el método de callback onRequestPermissionsResult () . y puedes agregar la lógica aquí.

 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(grantResults[0]== PackageManager.PERMISSION_GRANTED){ //Add your logic of saving a file to directory. } } 

Espero eso ayude 🙂

En Android Marshmallow, debe solicitar permisos peligrosos , incluido el grupo de permisos ALMACENAMIENTO, en tiempo de ejecución. Conozco una buena biblioteca que puede hacerte la vida más fácil, RxPermissions .

Puede solicitar un permiso con pocos códigos:

 RxPermissions.getInstance(this) .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) .subscribe(granted -> { if (granted) { // Always true pre-M // I can write to the storage now } else { // Oups permission denied } });