studio permission check android permissions sd-card denied

check - java io filenotfoundexception permission denied android



java.io.FileNotFoundException(permiso denegado) al intentar escribir en la tarjeta SD de Android (7)

Estoy tratando de seleccionar un archivo de imagen de la galería de fotos y escribir en la tarjeta SD. A continuación se muestra el código que se traduce en una excepción. Parece que se produce esta excepción cuando se intenta crear FileOutputStream. Tengo la siguiente línea agregada al archivo de manifiesto anidado dentro del elemento de la aplicación. No puedo encontrar una solución al problema:

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

public boolean saveSelectedImage( Uri selectedImage, int imageGroup, int imageNumber ) { boolean exception = false; InputStream input = null; OutputStream output = null; if( externalStorageIsWritable() ) { try { ContentResolver content = ctx.getContentResolver(); input = content.openInputStream( selectedImage ); if(input != null) Log.v( CLASS_NAME, "Input Stream Opened successfully"); File outFile = null; File root = Environment.getExternalStorageDirectory( ); if(root == null) Log.v(CLASS_NAME, "FAILED TO RETRIEVE DIRECTORY"); else Log.v(CLASS_NAME, "ROOT DIRECTORY is:"+root.toString()); output = new FileOutputStream( root+"/Image"+ imageGroup + "_" + imageNumber + ".png" ); if(output != null) Log.e( CLASS_NAME, "Output Stream Opened successfully"); // output = new FileOutputStream // ("/sdcard/Image"+imageGroup+"_"+imageNumber+".png"); byte[] buffer = new byte[1000]; int bytesRead = 0; while ( ( bytesRead = input.read( buffer, 0, buffer.length ) ) >= 0 ) { output.write( buffer, 0, buffer.length ); } } catch ( Exception e ) { Log.e( CLASS_NAME, "Exception occurred while moving image: "); e.printStackTrace(); exception = true; } finally { // if(input != null)input.close(); // if(output != null)output.close(); // if (exception ) return false; } return true; } else return false; }


Así es como debería verse tu archivo de manifiesto

<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".WriteCBTextToFileActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


Intente usar openFileOutput("filename") para devolver un FileOutputStream en lugar de especificar la ubicación por sí mismo.

Revisa el doc here


Puedes probar con:

String myPath=Environment.getExternalStorageDirectory()+"/Image"+ imageGroup + "_" + imageNumber + ".png"; File myFile = new File(); input = new FileInputStream(myFile);


Si tiene los permisos correctos establecidos en el manifiesto, asegúrese de que su dispositivo no esté en el modo "Unidad de disco" cuando se conecte a una PC. Cámbielo al modo "Sólo carga" y debería funcionar.


También debe asegurarse de que el subsistema de almacenamiento externo esté en el estado correcto; use Environment.getExternalStorageState() y busque Environment.MEDIA_MOUNTED que es el único estado seguro.

También es una buena idea limitar el manejo de excepciones a IOException torno a esas secciones, para que no se recupere en exceso de los problemas específicos de IO, por ejemplo, los medios sin montar.

Si necesita eventos, hay intentos de transmisión ( Intent.ACTION_MEDIA_xxx ) con la misma información que puede registrar con IntentListener .

También tenga en cuenta que el almacenamiento externo puede estar deshabilitado cuando está utilizando USB para la depuración.

También hay un período extendido durante el inicio del dispositivo, donde el almacenamiento externo no está disponible. Si haces cosas en servicios en el inicio, esto es un problema.

En general, su aplicación debe conocer el estado de almacenamiento externo cuando accede, y manejar los casos en que no está disponible, o deja de estar disponible al acceder a ella.


Tenga en cuenta que además de la respuesta de Saurabh, desde la API 23 debe solicitar permisos en tiempo de ejecución.

Consulte aquí: https://developer.android.com/training/permissions/requesting.html

Y la respuesta de Justin Fiedler aquí: https://.com/a/33288986/328059

Además, he tenido varios casos en los que, después de cambiar el permiso y volver a ejecutar la aplicación con Ejecución instantánea, los permisos no se actualizaron. Entonces, como práctica recomendada, después de cambiar el manifiesto, desinstalo la aplicación del dispositivo de destino y la reconstruyo.


Tuve este problema y las respuestas aquí no lo solucionaron, porque había cometido un error bastante tonto.

Asegúrate de darle a tu emulador de Android una tarjeta SD ... Había dejado el tamaño de la tarjeta SD en blanco y, por supuesto, no podía encontrar nada. Además de eso, estaba especificando un directorio dentro de dicha tarjeta SD que aún no se había creado, así que asegúrese de considerar ese caso también.

(Puede cambiar la configuración de la tarjeta SD de un AVD yendo al Administrador de dispositivos virtuales de Android, editando el emulador de su elección e ingresando algún valor para el tamaño de la tarjeta SD)