2015-05-18 11 views
10

Sto tentando di accedere ai contatti sul dispositivo e successivamente visualizzarli in un elenco, tuttavia quando provo ad accedervi con un cursore, viene visualizzato un errore che mi manca autorizzazioni per READ_CONTACTS ma ho già dato i permessi nel mio AndroidManifest.xmlDenial di autorizzazione durante il tentativo di accesso ai contatti in Android

codice in cui accedo a contatto:

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 errori

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) 

Qualsiasi aiuto sarà apprezzato!

+0

La sensibilità alle maiuscole è importante. Guarda il messaggio di errore e il caso che sta usando ... 'android.permission.READ_CONTACTS', poi guarda il tuo manifest ...' ANDROID.PERMISSION.READ_CONTACTS'. – Squonk

risposta

2

Aggiungere l'autorizzazione di utilizzo al di fuori del tag dell'applicazione e rendere android.permission in lettere minuscole. che dovrebbe risolvere il problema come concordato sotto nei commenti

+1

L'OP sta già dichiarando '' al di fuori dell'elemento ''. Il problema è con la case-sensitivity: sì, fa la differenza. – Squonk

+0

Whoops, sì ho pensato che fosse, se non al di fuori del tag dell'applicazione :) –

4

Dato che il nuovo runtime permission model viene introdotto in Android 6.0,

Spero che questo codice sarà utile se si desidera utilizzare runtime permission model. Puoi anche vedere l'implementazione dei dettagli e ottenere il codice sorgente da here.

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

enter image description here

enter image description here

+0

suo mostrando java.lang.ArrayIndexOutOfBoundsException: length = 0; index = 0 –

1

che avevo stessa situazione come quello che si ha, in pratica è solo bisogno di cambiare "android.permission.READ_CONTACTS" in minuscolo per il primo semestre si il permesso.

+0

Problemi correlati