studio - permisos para camara android
checkSelfPermission devolviendo PERMISSION_GRANTED para permiso revocado con targetSdkVersion<= 22 (2)
Para utilizar los nuevos modelos de permisos (y comprobar si su aplicación tiene o no el permiso), necesita actualizar su SDK de destino a 23. No tiene ningún sentido mantener el objetivo 22.
Estoy estudiando el nuevo modelo de permiso de Android Marshmallow pero me enfrento a un problema que me parece extraño.
Una aplicación con targetSdkVersion
22 (por lo que aún no utiliza el nuevo modelo de permiso de Android Marshmallow) declara el permiso READ_CONTACTS
en el manifiesto:
<uses-permission android:name="android.permission.READ_CONTACTS" />
e intenta leer el número de teléfono de un contacto a través de Intent.ACTION_PICK
:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT_REQUEST);
Cuando se ejecuta en un dispositivo con Marshmallow MRA58K, después de revocar el permiso después de instalar la aplicación a través de ADB, el método ContextCompat.checkSelfPermission()
aún devuelve PERMISSION_GRANTED
, pero la operación falla más tarde al acceder a los contactos porque se devuelve un cursor sin registros. Como entendí, esta es la estrategia predeterminada de "retrocompatibilidad" para evitar que la aplicación heredada se bloquee.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_CONTACT_REQUEST && resultCode == Activity.RESULT_OK) {
Log.i("", "Permission granted: " + (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED));
Uri contactUri = data.getData();
Cursor c = null;
try {
c = getContentResolver().query(contactUri, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null);
if (c != null && c.moveToFirst()) {
Log.i("", "got phone number: " + c.getString(0));
} else {
Log.w("", "No data received");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null) {
c.close();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
¿Cómo puedo detectar con seguridad si el usuario explícitamente antes del permiso antes de intentar la operación?
También probé el ejemplo oficial de Google en https://github.com/googlesamples/android-RuntimePermissions configurando targetSdkVersion
a 22 con el mismo resultado: registra que se ha otorgado el permiso incluso si el usuario lo revocó, y luego la operación falla .
Gracias ;)
Utilice el android.support.v4.content.PermissionChecker
https://developer.android.com/reference/android/support/v4/content/PermissionChecker.html