2015-05-18 9 views
10

Ich versuche, auf die Kontakte auf dem Gerät zugreifen und später in einer Liste anzeigen, aber wenn ich versuche, mit einem Cursor auf sie zuzugreifen, bekomme ich eine Fehlermeldung, die ich vermisse Berechtigungen für READ_CONTACTS aber ich habe bereits gab Berechtigungen in meinem AndroidManifest.xmlBerechtigung Ablehnung beim Versuch, auf Kontakte in Android zuzugreifen

-Code, wo ich Kontakte zugreifen:

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> 

Fehlerprotokoll

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) 

Jede Hilfe wird geschätzt!

+0

Groß-/Kleinschreibung ist wichtig. Schau dir die Fehlermeldung und den Fall an, den sie benutzt ... 'android.permission.READ_CONTACTS', dann schau dir dein Manifest an ...' ANDROID.PERMISSION.READ_CONTACTS'. – Squonk

Antwort

2

Fügen Sie die uses-permission außerhalb des Anwendungs-Tags hinzu und machen Sie die android.permission in Kleinbuchstaben. das sollte es beheben, wie unten in den Kommentaren vereinbart

+1

Das OP deklariert bereits '' außerhalb des '' Elements. Das Problem ist die Groß-/Kleinschreibung - ja, es macht einen Unterschied. – Squonk

+0

Whoops, yeah Ich dachte, das war es, wenn nicht außerhalb des Anwendungs-Tags :) –

4

Da die neue runtime permission model in Android 6.0 eingeführt wird

Hoffnung dieser Code wird helfen, wenn Sie runtime permission model verwenden möchten. Sie können auch die Detailimplementierung anzeigen und den Quellcode von here abrufen.

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

es zeigt java.lang.ArrayIndexOutOfBoundsException: length = 0; index = 0 –

1

ich hatte gleiche Situation wie das, was Sie haben, müssen Sie im Grunde nur „android.permission.READ_CONTACTS“ ändern für das erste Halb Sie die Erlaubnis in Kleinbuchstaben.

+0