studio read permission getexternalfilesdir from example create java android file io file-permissions

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 ("/" "," ");