2011-11-12 5 views
14

Je travaille sur une application simple qui parcourt les contacts de l'utilisateur. Malheureusement, je continue à obtenir l'erreur suivante:permission.READ_CONTACTS ne semble pas fonctionner

java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.HtcContactsProvider2 uri content://com.android.contacts/contacts from pid=27455, uid=10171 requires android.permission.READ_CONTACTS 

Mon fichier manifeste ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.helloMaps" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <application android:icon="@drawable/icon" 
     android:label="@string/app_name" 
     android:debuggable="true"> 
     <uses-library android:name="com.google.android.maps" /> 
     <activity android:name=".MapsActivity" 
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.NoTitleBar">    
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

     </activity> 
    </application> 
</manifest> 

Je suis en train de regarder mes contacts par:

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 

J'ai essayé d'ajouter <uses-permission android:name="android.permission.READ_CONTACTS" /> ou android:permission="android.permission.READ_CONTACTS" à <application> ou <activity>, mais les deux ne fonctionnaient pas.

Je manque d'options, est-ce que quelqu'un sait ce qui me manque ici?

+1

vérifier si vous autorisez l'autorisation sur votre configuration du téléphone android !! – Steve

Répondre

12

le <uses-permission> devrait être contenu dans l'élément <manifest>. Voir Structure of the Manifest File. Donc essayer de le mettre dans <application> ou <activity>, ne fonctionnera pas. déplacer Désespoir: essayez de déplacer <uses-sdk> avant <application>

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

Aussi, si vous pouvez tester sans les autres autorisations, les supprimer.

EDIT: Pouvez-vous s'il vous plaît vérifier si ceci est votre première ligne dans votre fichier manifeste:

<?xml version="1.0" encoding="utf-8"?> 
+0

merci pour votre réponse, j'ai d'abord déplacé '' tout le chemin, cela n'a pas aidé. Ensuite, j'ai supprimé toutes les autorisations, sauf pour le READ_CONTACTS, malheureusement, cela n'a pas fonctionné non plus – Danielvd

+0

Salut, j'ai édité ma réponse. Je ne suis pas sûr si vous avez posté tout votre manifeste, ou seulement une partie. Dans tous les cas, la déclaration d'autorisation est correcte. Pouvez-vous essayer de lancer "valider" sur votre manifeste? – hovanessyan

+0

mon mauvais, j'ai l'intention de poster mon manifeste entier, apparemment j'ai oublié la première ligne. J'ai édité ma question et ajouté la première ligne. – Danielvd

0

je suis tombé sur cette question aujourd'hui et aucune des corrections ci-dessus a fonctionné pour moi.

Qu'est-ce que le problème a fini par avoir à faire avec mon Eclipse. Ce que j'avais écrit dans le manifest.xml et ce qui était dans l'onglet Permissions n'étaient pas les mêmes. J'avais la permission READ_CONTACTS dans mon manifest.xml, mais READ_PROFILE était à sa place sous l'onglet de ma permission.

Je sais que c'est un vieux fil, mais j'espère que si quelqu'un a le même problème que moi, ils trébucheront à travers cela.

Merci!

3

J'ai eu le même problème et aucune des solutions que j'ai lues n'a aidé à résoudre jusqu'à ce que j'ai ajouté la permission WRITE_EXTERNAL_STORAGE avec la permission READ_CONTACTS.

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

Une idée de pourquoi vous auriez besoin de ça? – AdamMc331

6

j'étais totalement bloqué sur ce que je lis this article sur la façon dont les autorisations sont traitées en commençant par SDK 23. L'indice critique:

If the application's targetSdkVersion is set to less than 23. It will be assumed that application is not tested with new permission system yet and will switch to the same old behavior: user has to accept every single permission at install time and they will be all granted once installed !

J'ai ouvert mon dossier gradle.build et changé targetSdkVersion 23-targetSdkVersion 22, et maintenant tout fonctionne bien! Je trouverai finalement le temps de construire dans le nouveau système d'autorisations et de revenir à targetSdkVersion 23, ce qui est probablement la réponse la plus correcte. Ceci est un raccourci temporaire.

+1

C'était tout pour moi, merci! (Le message d'erreur de l'exception lancée par Android n'était pas très utile.) Nous avons choisi d'implémenter correctement les permissions d'exécution, et pour cela, les [documents officiels] (https://developer.android.com/training/permissions/requesting. html) étaient finalement la ressource la plus utile. – Jonik

3

Essayez dans votre méthode de créer

ActivityCompat.requestPermissions (ce, new String [] {Manifest.permission.READ_CONTACTS}, 1);

1

Aucune de ces réponses n'a aidé. La solution est assez simple. vous aurez besoin d'une demande d'autorisation d'exécution.

avec ou sans la permission dans votre manifeste, vous devrez demander cette autorisation à la volée de l'utilisateur. if(getApplicationContext().checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, resultValue);

alors seulement après l'approbation vous serez en mesure d'interroger le numéro de téléphone des contacts/nom, etc.