java - permission - read file from internal storage android
Existe el archivo y el directorio IS, pero listFiles() devuelve nulo (8)
De la documentación del método File ''listFiles'': Devuelve nulo si este nombre de ruta abstracto no indica un directorio, o si ocurre un error de E / S.
Entonces, tal vez ocurrió un error de E / S. Compruebe los permisos en ese directorio, ¿el usuario que ejecuta el programa java tiene permiso para leer ese directorio? Si no, ahí está tu respuesta. Si lo hacen, entonces tal vez el directorio esté vacío.
Por cierto, no debería usar + "" para convertir algo a una cadena, es una mala práctica, ya que es más lento que String.valueOf. Usaría StringUtils de apache para unir esa matriz a una cadena, pero eso requiere agregar ese jar a su classpath.
La documentación para File.listFiles()
sugiere que null
SÓLO será devuelto en el caso de que el archivo que lo llama no sea un directorio.
Tengo lo siguiente:
String dir = "/storage/emulated/0";
File f = new File(dir);
Log.v("Files",f.exists()+"");
Log.v("Files",f.isDirectory()+"");
Log.v("Files",f.listFiles()+"");
El registro dice:
true
true
null
Por algún motivo, listFiles(
) devuelve null
aunque el File
se reconoce como un directorio válido. No estoy muy familiarizado con el comportamiento de la jerarquía de archivos de Android, así que supongo que el problema radica en eso.
Como referencia, estoy depurando en mi Moto X, y los resultados son los mismos ya sea que el teléfono esté conectado a mi computadora o no, así que no creo que tenga que ver con el montaje cuando está enchufado.
En el archivo de manifiesto en la sección <uses-permission .... >
, agregue esta línea android:name="android.permission.READ_EXTERNAL_STORAGE"
. Creo que esto puede resolver tu problema.
Mi problema era que, por alguna razón, el atributo android: sharedUserId = "android.uid.system" no permitía que la aplicación leyera / sdcard / en un dispositivo específico.
Como necesitaba hacer solo una prueba rápida, eliminé el atributo sharedUserId, lo probé y lo agregué de nuevo.
Para aquellos con este problema, agregue esto a AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Problema resuelto: D
EDITAR: si esto no funciona, solo asegúrese de que la ruta sea correcta
Para aquellos con este problema, para dar permiso de lectura, agrégalo a AndroidManifest.xml:
android:name="android.permission.READ_EXTERNAL_STORAGE"
y también debes otorgar permiso de
Configuración> Aplicaciones> "Nombre de su aplicación" > Permisos> almacenamiento
Para la versión de Android > 23 , debe otorgar el permiso de tiempo de ejecución mediante programación en el método onresume como se indica a continuación,
public final String[] EXTERNAL_PERMS = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
};
public final int EXTERNAL_REQUEST = 138;
requestForPermission();
public boolean requestForPermission() {
boolean isPermissionOn = true;
final int version = Build.VERSION.SDK_INT;
if (version >= 23) {
if (!canAccessExternalSd()) {
isPermissionOn = false;
requestPermissions(EXTERNAL_PERMS, EXTERNAL_REQUEST);
}
}
return isPermissionOn;
}
public boolean canAccessExternalSd() {
return (hasPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
}
private boolean hasPermission(String perm) {
return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, perm));
}
Simplemente agregue el permiso en el manifiesto uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
y su problema será resuelto.
Tuve un problema similar en Java pero no en Android, donde estoy leyendo el archivo de configuración con la ruta entre comillas. Solucioné mi problema simplemente con eliminar citas
Entonces puede hacerlo mediante la función de reemplazo de cadenas o darlo sin comillas
String someString = "C: / path"; someString = someString.replace ("/" "," ");