java android android-6.0-marshmallow

java - La creación de directorios no funciona en Android Marshmallow



android-6.0-marshmallow (3)

Estoy creando un directorio en mi aplicación nativa. Funciona perfectamente en Android 5.0, pero en Android 6.0 (Marshmallow) algunas veces funcionó y otras no. Estoy usando el siguiente código para crear un nuevo directorio. Estoy guardando archivos de video e 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(); }


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


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

this enlace puede ser útil

Por lo tanto, el permiso WRITE_EXTERNAL_STORAGE debe solicitarse 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á anular el método de devolución de llamada 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 :)


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