permission open node failed error eacces android filenotfoundexception

android - open - abierto fallido: EACCES(Permiso denegado)



hit error eacces permission denied mkdir (13)

Tengo un problema muy extraño con el acceso al almacenamiento en algunos dispositivos. La aplicación funciona en mis dispositivos de prueba (Nexus 4 y 7, Samsung GS5). Todos mis dispositivos con Android 4.4.2. Pero recibí muchos correos electrónicos de usuarios que decían que la aplicación no puede escribir en el almacenamiento (ni el almacenamiento interno ni la tarjeta SD). Desde el archivo de registro recibido de los comentarios de los usuarios, puedo ver que el problema es el siguiente código:

try { if (fStream == null) { fStream = new FileOutputStream(filename, true); } fStream.write(data, 0, bytes); return; } catch (IOException ex) { ex.printStackTrace(); }

Lanza una excepción en la línea fStream = new FileOutputStream (filename, true); al crear FileOutputStream.

El registro de la pila es:

W/System.err( 8147): Caused by: java.io.FileNotFoundException: /storage/emulated/0/my_folder/test_file_name.png: open failed: EACCES (Permission denied) w/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:409) W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:88) W/System.err( 8147): at java.io.FileOutputStream.<init>(FileOutputStream.java:128) W/System.err( 8147): at myapp.save(SourceFile:515) W/System.err( 8147): ... 8 more W/System.err( 8147): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied) W/System.err( 8147): at libcore.io.Posix.open(Native Method) W/System.err( 8147): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) W/System.err( 8147): at libcore.io.IoBridge.open(IoBridge.java:393) W/System.err( 8147): ... 11 more

En AndroidManifest.xml tengo declarados los siguientes permisos:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Confirmé que los usuarios están usando la aplicación privada correcta en la tarjeta SD. Y lo que es más extraño es que tampoco puede escribir en el almacenamiento interno. ¿Cómo puede suceder esto si tengo los permisos de lectura y escritura? Los usuarios dicen que no están conectando sus dispositivos a la PC en ese momento.

Actualizar

Resulta que llamo abrir y cerrar FileOutputStream con demasiada frecuencia, lo que arroja la excepción FileNotFoundException en algún momento. Suena más como un problema de enhebrado.


En mi caso fue un problema de permisos. El problema es que en el dispositivo con Android 4.0.4 obtuve acceso al archivo sin ningún error o excepción. Y en el dispositivo con Android 5.1 falló con la excepción ACCESS (error de apertura: EACCES (Permiso denegado)). Gestionado con la adición de seguir el permiso para manifestar el archivo:

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

Así que supongo que es la diferencia entre la administración de permisos en las versiones del sistema operativo lo que causa fallas.


En mi caso utilicé la opción android:isolatedProcess="true" para un service en AndroidManifest.xml .

Tan pronto como lo eliminé, el error desapareció ...


En mi caso, el problema era que la configuración WIFI que era estática tenía un conflicto con otro dispositivo que usaba la misma dirección IP.


En mi caso, tuve el caso incorrecto en

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

android.permission debe estar en minúscula, y de alguna manera toda la cadena estaba en mayúscula en nuestra fuente.


Me encontré con el mismo problema y descubrí que tengo que solicitar los permisos en tiempo de ejecución, incluso si lo he declarado en el manifiesto. Tal como lo declaró la respuesta de Justin Fiedler.

La documentación oficial sobre esto está aquí: https://developer.android.com/training/permissions/requesting.html

Mi implementación es ligeramente diferente de la respuesta de Justin Fiedler, que también implementa el método vRequestPermissionsResult del fragmento v4 para manejar la respuesta a la solicitud de permisos.

public static final int REQUEST_EXTERNAL_PERMISSION_CODE = 666; @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) public static final String[] PERMISSIONS_EXTERNAL_STORAGE = { READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE }; public boolean checkExternalStoragePermission(Activity activity) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { return true; } int readStoragePermissionState = ContextCompat.checkSelfPermission(activity, READ_EXTERNAL_STORAGE); int writeStoragePermissionState = ContextCompat.checkSelfPermission(activity, WRITE_EXTERNAL_STORAGE); boolean externalStoragePermissionGranted = readStoragePermissionState == PackageManager.PERMISSION_GRANTED && writeStoragePermissionState == PackageManager.PERMISSION_GRANTED; if (!externalStoragePermissionGranted) { requestPermissions(PERMISSIONS_EXTERNAL_STORAGE, REQUEST_EXTERNAL_PERMISSION_CODE); } return externalStoragePermissionGranted; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (requestCode == REQUEST_EXTERNAL_PERMISSION_CODE) { if (checkExternalStoragePermission(getActivity())) { // Continue with your action after permission request succeed } } } }


Me encontré con un problema similar hace un tiempo.

Tu problema podría estar en dos áreas diferentes. Es la forma en que está creando el archivo para escribir, o su método de escritura puede ser defectuoso ya que depende del teléfono.

Si está escribiendo el archivo en una ubicación específica en la tarjeta SD, intente utilizar variables de entorno. Siempre deben señalar a una ubicación válida. Aquí hay un ejemplo para escribir en la carpeta de descargas:

java.io.File xmlFile = new java.io.File(Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/Filename.xml");

Si está escribiendo el archivo en el almacenamiento interno de la aplicación. Prueba este ejemplo:

java.io.File xmlFile = new java.io.File((getActivity() .getApplicationContext().getFileStreamPath("FileName.xml") .getPath()));

Personalmente confío en las bibliotecas externas para manejar la transmisión al archivo. Este no me ha fallado todavía.

org.apache.commons.io.FileUtils.copyInputStreamToFile(is, file);

He perdido datos demasiadas veces en un comando de escritura fallida, por lo que confío en bibliotecas bien conocidas y probadas para mi IO Heavy Lift.

Una nota más, si los archivos son grandes, también puede considerar ejecutar el IO en segundo plano, o usar devoluciones de llamada.


Para la API 23+ necesita solicitar los permisos de lectura / escritura, incluso si ya están en su manifiesto.

// Storage Permissions private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; /** * Checks if the app has permission to write to device storage * * If the app does not has permission then the user will be prompted to grant permissions * * @param activity */ public static void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don''t have permission so prompt the user ActivityCompat.requestPermissions( activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE ); } }

AndroidManifest.xml

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


Primero otorgue o revise permisos como

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

Si estos dos permisos son correctos, verifique que sus flujos de salida estén en el formato correcto.

Ejemplo:

FileOutputStream fos=new FileOutputStream(Environment.getExternalStorageDirectory()+"/rahul1.jpg");


Si los clientes usan Android 6.0, Android agregó un nuevo modelo de permiso para (Marshmallow).

Truco: si su objetivo es la versión 22 o inferior, su aplicación solicitará todos los permisos en el momento de la instalación como lo haría en cualquier dispositivo que ejecute un sistema operativo debajo de Marshmallow.


También encontré la solución para mi camino.

Antes de la aplicación de lanzamiento, concedí root al explorador de archivos y no deshabilité el permiso de escritura / lectura al salir de la aplicación.

Mi aplicación no puede usar memoria externa mientras que yo hice el dispositivo de restricción para restablecer todos los permisos.


También me enfrenté al mismo problema. Después de mucho trabajo duro, encontré lo que estaba mal en mi caso. Mi dispositivo estaba conectado a la computadora a través de un cable USB. Hay tipos de conexiones USB como almacenamiento masivo, dispositivo de medios (MTP), cámara (PTP), etc. Mi tipo de conexión era "Almacenamiento masivo", y esto estaba causando los problemas. Cuando cambié el tipo de conexión, el problema fue resuelto.

Recuerde siempre al acceder al sistema de archivos en el dispositivo Android:

NO CONECTE COMO ALMACENAMIENTO MASIVO en la computadora / pc.


Tengo el mismo problema, pero a veces, el problema más difícil es obtener una respuesta simple.

¡Comprobé los permisos manifiestos y WAS_NOT me escribió una vergüenza!


en mi caso me olvidé de agregar / delante del nombre del archivo después de agregar que me deshice de él

bitmap.compress(Bitmap.CompressFormat.PNG,100,new FileOutputStream(Environment.getExternalStorageDirectory()+"/arjunreddy.png"));