Negación de permisos al intentar acceder a contactos en Android

Estoy intentando tener acceso a los contactos en el dispositivo y después mostrarlos en una lista, sin embargo cuando intento tener acceso a ellos con un cursor, consigo un error que falto permisos para READ_CONTACTS pero he dado ya permisos en mi AndroidManifest .xml

Código donde accedo a Contactos:

public void setupCursor() { Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Toast.makeText(this, name + ": " + number, Toast.LENGTH_SHORT).show(); } cursor.close(); } 

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.github.brady131313.textback" > <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="21"/> <uses-permission android:name="ANDROID.PERMISSION.READ_CONTACTS"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".ActivityMainSettings" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ActivityContactSelect" android:label="Select Contacts"> </activity> </application> </manifest> 

Registro de errores

 05-17 17:12:41.544 20202-20202/io.github.brady131313.textback E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: io.github.brady131313.textback, PID: 20202 java.lang.RuntimeException: Unable to start activity ComponentInfo{io.github.brady131313.textback/io.github.brady131313.textback.ActivityContactSelect}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{14c069a9 20202:io.github.brady131313.textback/u0a90} (pid=20202, uid=10090) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2661) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) at android.app.ActivityThread.access$900(ActivityThread.java:172) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5835) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183) Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{14c069a9 20202:io.github.brady131313.textback/u0a90} (pid=20202, uid=10090) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS at android.os.Parcel.readException(Parcel.java:1540) at android.os.Parcel.readException(Parcel.java:1493) at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3582) at android.app.ActivityThread.acquireProvider(ActivityThread.java:5081) at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2926) at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1452) at android.content.ContentResolver.query(ContentResolver.java:468) at android.content.ContentResolver.query(ContentResolver.java:428) at io.github.brady131313.textback.ActivityContactSelect.setupCursor(ActivityContactSelect.java:46) at io.github.brady131313.textback.ActivityContactSelect.onCreate(ActivityContactSelect.java:32) at android.app.Activity.performCreate(Activity.java:6221) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2614)            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)            at android.app.ActivityThread.access$900(ActivityThread.java:172)            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)            at android.os.Handler.dispatchMessage(Handler.java:102)            at android.os.Looper.loop(Looper.java:145)            at android.app.ActivityThread.main(ActivityThread.java:5835)            at java.lang.reflect.Method.invoke(Native Method)            at java.lang.reflect.Method.invoke(Method.java:372)            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183) 

¡Cualquier ayuda será apreciada!

Agregue los usos-permiso fuera de la etiqueta de la aplicación y haga que el android.permission en minúsculas. Que debe arreglarlo como se acordó a continuación en los comentarios

Dado que el nuevo modelo de permiso de ejecución se introduce en Android 6.0,

Espero que este código le ayudará si desea utilizar el modelo de permisos de tiempo de ejecución . También puede ver la implementación detallada y obtener código fuente desde aquí .

 import android.Manifest; import android.content.ContentResolver; import android.content.pm.PackageManager; import android.database.Cursor; import android.os.Build; import android.provider.ContactsContract; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { // The ListView private ListView lstNames; // Request code for READ_CONTACTS. It can be any number > 0. private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Find the list view this.lstNames = (ListView) findViewById(R.id.lstNames); // Read and show the contacts showContacts(); } /** * Show the contacts in the ListView. */ private void showContacts() { // Check the SDK version and whether the permission is already granted or not. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS); //After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method } else { // Android version is lesser than 6.0 or the permission is already granted. List<String> contacts = getContactNames(); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contacts); lstNames.setAdapter(adapter); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission is granted showContacts(); } else { Toast.makeText(this, "Until you grant the permission, we canot display the names", Toast.LENGTH_SHORT).show(); } } } /** * Read the name of all the contacts. * * @return a list of names. */ private List<String> getContactNames() { List<String> contacts = new ArrayList<>(); // Get the ContentResolver ContentResolver cr = getContentResolver(); // Get the Cursor of all the contacts Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); // Move the cursor to first. Also check whether the cursor is empty or not. if (cursor.moveToFirst()) { // Iterate through the cursor do { // Get the contacts name String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); contacts.add(name); } while (cursor.moveToNext()); } // Close the curosor cursor.close(); return contacts; } } 

Introduzca aquí la descripción de la imagen

Introduzca aquí la descripción de la imagen

Tuve la misma situación como lo que tienes, básicamente sólo necesita cambiar "android.permission.READ_CONTACTS" a minúsculas para la primera mitad que el permiso.

  • ¿Por qué un permiso de GCM no se concede en Android 6?
  • ¿Qué permisos necesita una aplicación de Android para poder usar el Servicio de Administrador de Alarma?
  • Permisos para Android: ¿Cómo puedo saber cuáles son peligrosos frente a lo normal?
  • Recuperar lista de permisos
  • ¿Android seguirá utilizando GPS para extraer la ubicación cuando se solicite sólo COARSE_LOCATION?
  • Permisos de Android M con notificaciones de parsemisión
  • Proveedor de contenido grant uri permission
  • XML Lista de permisos de Android completa
  • Cómo obtener permisos de manifiesto de cualquier aplicación Android instalada
  • ¿Puede un Servicio de Android tener permisos múltiples?
  • Conceder a la aplicación Android el permiso de android.permission.INTERNET mientras se depura en el dispositivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.