Android: mkdirs () / mkdir () en almacenamiento externo devuelve false


Me vuelvo loco con esto:

Log.d("STATE", Environment.getExternalStorageState());
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "work_data");
Log.d("PATH", f.getAbsolutePath());
if (!f.exists()) {
    Log.d("MAKE DIR", f.mkdirs() + "");
}

El registro de salida se ve así:

STATE     mounted
PATH      /mnt/sdcard/DCIM/work_data
MAKE DIR  false

Me aseguré de añadir el permiso correcto:

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

Pero no se por qué no pudo crear la carpeta. También usé mkdir() paso a paso, pero el resultado es el mismo. Ayúdame, por favor. He buscado mucho en Google y he pasado al menos 2 días en esta estúpida cosa. ¡Gracias por tu ayuda!!

EDICIÓN:

Lo siento todo el mundo! Había añadido <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> en la etiqueta <application>. esta fue mi error! Pero gracias todos ustedes para responder.

Author: Chris, 2011-08-27

11 answers

He tenido el mismo problema y he buscado todo durante una semana tratando de encontrar la respuesta. Creo que lo encontré y creo que es ridículamente fácil, tienes que poner la declaración de permisos de uso en el lugar correcto...

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.company.name" 
    android:versionCode="1"
    android:versionName="0.2">

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

Cuando lo tenía dentro de la sección no funcionaba.

 25
Author: Omnivore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-13 01:41:10

Tengo el mismo problema, y estoy seguro de que había puesto la etiqueta de permiso en el lugar correcto, pero mkdirs no funcionó todavía, mi sistema es Android 6.0, lo resuelvo ahora, puede verificar lo siguiente:

  1. asegúrese de colocar la etiqueta de permiso.
  2. abra "configuración/aplicación" en su teléfono,verifique el permiso de su aplicación(encontré que el permiso en mi declaración de manifiesto no está aquí),abra el interruptor del permiso de esta manera.(Me pareció que está cerrado por defecto que hacen " mkdirs" failed)

introduzca la descripción de la imagen aquí

 49
Author: Fido Zhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-13 02:59:02

Sé que este es un post antiguo, pero tal vez mi respuesta pueda ayudar a alguien.

Después de varios días lidiando con este problema me he dado cuenta de que mientras el teléfono está conectado al PC, que resulta ser siempre durante el desarrollo, la tarjeta SD no está disponible. Haciendo así fallar cualquier intento de crear un directorio o archivo sobre él. Para hacerlo "más fácil" parecía comportarse de manera diferente dependiendo del teléfono bajo prueba.

Sé que puede sonar un problema bastante tonto, pero cuesta un montón de tiempo que tal vez algún otro puede ahorrar.

 12
Author: Clark Ku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-23 14:08:57

Añade esta línea de código en onCreate ()

ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
 4
Author: Osama Ibrahim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 09:10:57

Pon esto

Log.d("MAKE DIR", f.mkdir() + "");

En lugar de

Log.d("MAKE DIR", f.mkdirs() + "");

O prueba esto

String s=Environment.getExternalStorageDirectory().toString()+"/";
File f = new File(s+"DCIM/work_data");
 2
Author: Azhar Shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-27 04:59:38

Su código está funcionando bien para mí.No hay nada malo en tu código. Solo si está haciendo que un directorio use f.mkdir() en lugar de f.mkdirs() Puedes ver tu carpeta en mnt => Sd card => DCIM => work_data

 2
Author: Dharmendra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-27 05:02:09

Mkdirs() solo devuelve true si el directorio fue creado. Si ya está en su lugar, debe devolver false. Así que apostaría a que este directorio ya existe.

 2
Author: dragonroot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-27 05:51:00

Tuve el mismo problema, y solo quería compartir mi corrección. según android A partir de Android 4.4, leer o escribir archivos en los directorios privados de tu app no requiere los permisos READ_EXTERNAL_STORAGE o WRITE_EXTERNAL_STORAGE.

Por lo tanto, puede declarar que el permiso debe solicitarse solo en las versiones inferiores de Android agregando el atributo maxSdkVersion:

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

Pero maxSdkVersion es el problema, acabo de eliminarlo y ahora lo obrar.

 2
Author: Manish Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-09 10:27:52

Si tienes android 6.0 y más, asegúrate de que tu sdk de destino en el archivo gradle sea inferior a 22:

targetSdkVersion 22

O necesita implementar permisos de tiempo de ejecución.

 2
Author: phnmnn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-22 19:51:41

Esto podría ayudar a alguien en el futuro.

El problema también podría ser que escriba la dirección "/File/Address/" en lugar de escribir

File.separator + "File" + File.separator + "Address" + File.separator

Esto es una cosa tan pequeña y estúpida, pero esto funcionó para mí después de perder horas de mi tiempo.

 1
Author: Mayank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-16 22:07:29

Intenté hacer un conjunto de subcarpetas en el almacenamiento externo 'Test/Test1/Test2' cuando mkdirs() seguía devolviendo false. Resulta que 'Test' es una palabra reservada para una carpeta en la raíz de almacenamiento externo (o puede haber sido una carpeta oculta). Esto fue en un Motorola G (XT1541) y puede aplicarse a otros dispositivos también.

 0
Author: Roland van der Linden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 05:50:50