permission - Android: mkdirs()/mkdir() en almacenamiento externo devuelve falso
internal storage android example (11)
Esto podría ayudar a alguien en el futuro.
El problema también podría ser que escriba la dirección "/ Archivo / Dirección /" en lugar de que escriba
File.separator + "File" + File.separator + "Address" + File.separator
Esto es algo tan pequeño y estúpido, pero me funcionó después de perder horas de mi tiempo.
Me vuelve 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 sé por qué no se pudo crear la carpeta. También usé mkdir()
paso a paso pero el resultado es el mismo. Por favor, ayúdame. He buscado mucho en Google y he pasado al menos 2 días en esta cosa estúpida. ¡¡Gracias por tu ayuda!!
EDICIÓN:
Lo siento todos! Había añadido <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
en la etiqueta <application>
. este fue mi error Pero gracias a todos por su respuesta.
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 tuve dentro de la sección <application> </application> no funcionó.
Intenté crear un conjunto de subcarpetas en el almacenamiento externo ''Test / Test1 / Test2'' cuando mkdirs () seguía devolviendo false. Resulta que ''Prueba'' es una palabra reservada para una carpeta en la raíz de almacenamiento externa (o puede haber sido una carpeta oculta). Esto estaba en un Motorola G (XT1541) y puede aplicarse a otros dispositivos también.
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");
Sé que este es un post antiguo, pero tal vez mi respuesta pueda ayudar a alguien.
Después de varios días de lidiar con este problema, me he dado cuenta de que, mientras el teléfono está conectado a la PC, lo que siempre ocurre durante el desarrollo, la tarjeta SD no está disponible. Por lo tanto, hacer que falle 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 a prueba.
Sé que puede parecer un problema bastante tonto, pero cuesta mucho tiempo que quizás otros puedan ahorrar.
Si tienes Android 6.0 y más, asegúrate de que tu SDK de destino en el archivo de gradle sea inferior a 22:
targetSdkVersion 22
o necesita implementar permisos de tiempo de ejecución.
Tengo el mismo problema, y estoy seguro de que había puesto la etiqueta de permiso en el lugar correcto, pero mkdirs aún no funcionaba, mi sistema es Android 6.0, lo resuelvo ahora, puede verificarlo a continuación:
- Asegúrate de poner tu etiqueta de permiso en.
- 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 (encontré que está cerrado por defecto, lo que hace que "mkdirs" ha fallado)
Tu código funciona bien para mí. No hay nada malo en tu código. Solo si está creando un directorio, use f.mkdir()
lugar de f.mkdirs()
Puede ver su carpeta en mnt => Sd card => DCIM => work_data
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 su aplicación 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 el problema es maxSdkVersion, acabo de eliminarlo y ahora funciona.
agregue esta línea de código en OnCreate ()
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
mkdirs () solo devuelve true si el directorio fue creado. Si ya está en su lugar, debe devolver falso. Así que apostaría que este directorio ya existe.