java - instalar - Android 6.0 open falló: EACCES(Permiso denegado)
fingerprint android studio (8)
Android agregó un nuevo modelo de permiso para Android 6.0 (Marshmallow) .
Por lo tanto, debe verificar el
Runtime Permission
:
¿Qué son los permisos de tiempo de ejecución?
Con Android 6.0 Marshmallow, Google introdujo un nuevo modelo de permisos que permite a los usuarios comprender mejor por qué una aplicación puede solicitar permisos específicos. En lugar de que el usuario acepte ciegamente todos los permisos en el momento de la instalación, ahora se le solicita que acepte los permisos cuando sean necesarios durante el uso de la aplicación.
¿Cuándo implementar el nuevo modelo?
no requiere soporte completo hasta que elija la versión 23 de destino en su aplicación. Si está apuntando a 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 por debajo de Marshmallow.
Esta información se toma de aquí:
Consulte Cómo implementar desde este enlace:
He agregado
uses-permission
incluyen
WRITE_EXTERNAL_STORAGE
,
MOUNT_UNMOUNT_FILESYSTEMS
,
READ_EXTERNAL_STORAGE
a
AndroidManifest.xml
.
Cuando intenté ejecutar mi aplicación en Nexus5 (Android 6.0), arrojó una excepción de la siguiente manera:
java.io.IOException: open failed: EACCES (Permission denied)
Y probé con otro teléfono Android (Android 5.1), todo estaba bien. Aquí está el código:
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
currentPhotoPath = image.getAbsolutePath();
return image;
}
¿Android 6.0 tiene una diferencia sobre el permiso?
Desde API-23 debe declarar el permiso en actividad incluso si ya lo ha declarado en manifiesto.
// Storage Permissions variables
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
//persmission method.
public static void verifyStoragePermissions(Activity activity) {
// Check if we have read or write permission
int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) {
// We don''t have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
Para usar simplemente llame a
verifyStoragePermissions(this);
en onCreate.
Eso debería hacerlo con suerte.
En Android 6 (Marshmallow) , a pesar de que el usuario aceptó todos sus permisos en el momento de la instalación, más tarde puede decidir quitarle algunos de esos permisos.
Solución rápida pero no recomendada:
tal vez si cambia su
targetSdkVersion
en el gradle a
22
, el problema se resolverá.
¿Cómo implementar? (Mejores prácticas)
-
Primero determine si el dispositivo del usuario es un dispositivo Marshmallow o no:
private boolean shouldAskPermission(){ return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1); }
-
Si
shouldAskPermission()
devuelvetrue
, solicite el permiso que necesita:String[] perms = {"android.permission.WRITE_EXTERNAL_STORAGE"}; int permsRequestCode = 200; requestPermissions(perms, permsRequestCode);
El método
requestPermissions(String[] permissions, int requestCode);
es un método público que se encuentra dentro de la clase de Actividad de Android.
-
Recibirá los resultados de su solicitud en el método onRequestPermissionResult como se muestra a continuación:
@Override public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){ switch(permsRequestCode){ case 200: boolean writeAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED; break; } }
Después de recibir los resultados, deberá manejarlos adecuadamente.
Flujo de permisos sugerido:
Más información:
Un usuario con un dispositivo Marshmallow ahora podrá revocar permisos peligrosos a través de la configuración de la aplicación
Android define algunos permisos como " peligrosos " y algunos permisos como " normales ". Ambos son necesarios en el manifiesto de su aplicación, pero solo los permisos peligrosos requieren una solicitud de tiempo de ejecución.
Si ha optado por no implementar el nuevo modelo de permisos (solicitud de tiempo de ejecución), la revocación de los permisos puede causar experiencias de usuario no deseadas y, en algunos casos, fallas de la aplicación.
La siguiente tabla enumera todos los permisos peligrosos actuales y sus respectivos grupos:
Si el usuario acepta un permiso en un grupo / categoría, ¡acepta todo el grupo!
Usando la Biblioteca Dexter:
Puedes usar Dexter . Biblioteca de Android que simplifica el proceso de solicitud de permisos en tiempo de ejecución.
Encontré el mismo problema.
Tal vez sea causado por el mecanismo de seguridad de su teléfono. Puede ir a ''configuración'' para autorizar permisos de escritura / lectura.
Esto funcionó para mí.
Vaya a Configuración -> Aplicaciones -> YourApp -> Proporcionar permisos de almacenamiento, contactos, etc.
Para mí, mi teléfono conectado como USB como MTP fue el problema incluso después de hacer todo lo que se indica aquí. Cambié a "Solo carga" funcionó para mí.
Si eres flojo, solo baja la targetSdkVersion a 22 (antes de lollipop)
También puede usar ActivityCompat.requestPermissions para compatibilidad con versiones anteriores.
ejemplo:
private static final int REQUEST_CODE = 0x11;
String[] permissions = {"android.permission.WRITE_EXTERNAL_STORAGE"};
ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE); // without sdk version check
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// save file
} else {
Toast.makeText(getApplicationContext(), "PERMISSION_DENIED", Toast.LENGTH_SHORT).show();
}
}
}