Java.lang.SecurityException intentando leer desde los contactos de Android URI

Estoy tratando de leer los nombres de los contactos, números de teléfono y correos electrónicos del URI de ContactsContract , y estoy obteniendo una excepción de SecurityException cuando intento ejecutar el programa. He establecido el permiso en el archivo AndroidManifest.xml :

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="edu.smumn.cs394" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> **<uses-permission android:name="android.pemission.READ_CONTACTS"/>** <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ReadPhoneNumbers" 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> </manifest>` 

El siguiente es el código de la aplicación:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contact_list); ContentResolver resolver = getContentResolver(); Cursor c = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //[...] Work through data here` 

Recibo una excepción de seguridad en la última línea ( resolver.query() ):

 `03-08 07:41:40.812: ERROR/AndroidRuntime(416): FATAL EXCEPTION: main 03-08 07:41:40.812: ERROR/AndroidRuntime(416): java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.smumn.cs394/edu.smumn.cs394.ReadPhoneNumbers}: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts from pid=416, uid=10037 requires android.permission.READ_CONTACTS [...] 03-08 07:41:40.812: ERROR/AndroidRuntime(416): Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts from pid=416, uid=10037 requires android.permission.READ_CONTACTS [...] 03-08 07:41:40.812: ERROR/AndroidRuntime(416): at edu.smumn.cs394.ReadPhoneNumbers.onCreate(ReadPhoneNumbers.java:30) 

[…] `

Debo estar extrañando algo, pero no puedo imaginar qué.

Asegúrese de agregarla fuera de la etiqueta de la aplicación. Durante el desarrollo de una plataforma de destino de 2.3.3 con Eclipse en Ubuntu, tuve fallos de permisos en el archivo de registro que indicaban que necesitaba esta línea exacta mientras trabajaba en algo similar. No fue hasta que moví la línea * uses-permission … READ_CONTACTS * fuera de la etiqueta de la aplicación que funcionaba.

Solicitar permisos en tiempo de ejecución

A partir de Android 6.0 (API nivel 23), los usuarios conceden permisos a las aplicaciones mientras se ejecuta la aplicación, no cuando instalan la aplicación.

Si el permiso que necesita agregar no aparece en los permisos normales, tendrá que tratar con "Permisos de tiempo de ejecución". Los permisos de tiempo de ejecución son permisos que se solicitan cuando se necesitan mientras se ejecuta la aplicación. Estos permisos mostrarán un diálogo al usuario, similar al siguiente:

Introduzca aquí la descripción de la imagen

El primer paso al agregar un "Permiso de tiempo de ejecución" es agregarlo al AndroidManifest:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.codepath.androidpermissionsdemo" > <uses-permission android:name="android.permission.READ_CONTACTS" /> ... </manifest> 

A continuación, deberá iniciar la solicitud de permiso y manejar el resultado. El siguiente código muestra cómo hacerlo en el contexto de una actividad, pero esto también es posible desde dentro de un fragmento.

 // MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // In an actual app, you'd want to request a permission when the user performs an action // that requires that permission. getPermissionToReadUserContacts(); } // Identifier for the permission request private static final int READ_CONTACTS_PERMISSIONS_REQUEST = 1; // Called when the user is performing an action which requires the app to read the // user's contacts public void getPermissionToReadUserContacts() { // 1) Use the support library version ContextCompat.checkSelfPermission(...) to avoid // checking the build version since Context.checkSelfPermission(...) is only available // in Marshmallow // 2) Always check for permission (even if permission has already been granted) // since the user can revoke permissions at any time through Settings if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // The permission is NOT already granted. // Check if the user has been asked about this permission already and denied // it. If so, we want to give more explanation about why the permission is needed. if (shouldShowRequestPermissionRationale( Manifest.permission.READ_CONTACTS)) { // Show our own UI to explain to the user why we need to read the contacts // before actually requesting the permission and showing the default UI } // Fire off an async request to actually get the permission // This will show the standard permission request dialog UI requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_PERMISSIONS_REQUEST); } } // Callback with the request from calling requestPermissions(...) @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { // Make sure it's our original READ_CONTACTS request if (requestCode == READ_CONTACTS_PERMISSIONS_REQUEST) { if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "Read Contacts permission granted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Read Contacts permission denied", Toast.LENGTH_SHORT).show(); } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } } 

Hola Steven el rastreo de registro de depuración le indica que necesita … requiere android.permission.READ_CONTACTS

Así que intenta algo editando el Manifest.xml como añadir otro permiso, deja ver si no se lee correctamente.

Y compruebe esta línea sin **

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

Dan

Con la api 23, permiso no funciona, cambia el nivel de api en el emulador para api 22 (piruleta) o inferior

Si el dispositivo está ejecutando Android 6.0 o superior y el SDK de destino de la aplicación es 23 o superior: La aplicación debe enumerar los permisos en el manifiesto y debe solicitar cada permiso peligroso que necesita mientras se ejecuta la aplicación. El usuario puede conceder o denegar cada permiso, y la aplicación puede seguir ejecutándose con capacidades limitadas incluso si el usuario niega una solicitud de permiso.

EJEMPLO:

  //thisActivity is the running activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } 

http://developer.android.com/training/permissions/requesting.html

  • Número de marcado sin indicador
  • ¿Es posible eliminar permisos de una aplicación de Android?
  • Android M permiso de la prueba READ_PHONE_STATE (permisos peligrosos)
  • Obtener: No se permite iniciar el servicio Intención ... sin permiso Proceso de servicio es malo
  • Facebook, setReadPermissions y setPublishPermissions
  • ActivityCompat.requestPermissions que no muestran el cuadro de diálogo
  • Permiso de denegación: ... requiere android.permission.WRITE_EXTERNAL_STORAGE
  • Adb remount permiso denegado, pero capaz de acceder a superusuario en shell - android
  • Permisos de archivo en Android
  • Permiso de manifiesto en Android Studio
  • ¿Qué permisos necesita una aplicación de Android para poder usar el Servicio de Administrador de Alarma?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.