ubicacion studio permisos permiso pedir para llamar leer lanzar enviar contactos camara asignar android android-6.0-marshmallow

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 ;)