2015-05-18 6 views
10

मैं डिवाइस पर संपर्कों तक पहुंचने का प्रयास कर रहा हूं और बाद में उन्हें एक सूची में प्रदर्शित करता हूं, हालांकि जब मैं उन्हें कर्सर से एक्सेस करने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है जो मुझे याद आ रही है READ_CONTACTS के लिए अनुमतियाँ, लेकिन मैं पहले से ही मेरे AndroidManifest.xml में अनुमतियाँ दे दी हैAndroid में संपर्कों को एक्सेस करने का प्रयास करते समय अनुमति अस्वीकार

कोड जहाँ मैं संपर्क में पहुंचने के:

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> 

त्रुटि लॉग

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) 

किसी भी मदद की सराहना की जाएगी!

+0

केस संवेदनशीलता सभी महत्वपूर्ण है। त्रुटि संदेश और जिस मामले का उपयोग कर रहा है उसे देखें ... 'android.permission.READ_CONTACTS' फिर अपने मैनिफेस्ट को देखें ...' ANDROID.PERMISSION.READ_CONTACTS'। – Squonk

उत्तर

2

एप्लिकेशन टैग के बाहर उपयोग-अनुमति जोड़ें और android.permission लोअरकेस बनाएं। कि यह, के रूप में टिप्पणी

+1

ओपी पहले ही '' तत्व के बाहर '<उपयोग-अनुमति />' घोषित कर रहा है। मुद्दा केस-संवेदनशीलता के साथ है - हाँ, इससे कोई फर्क पड़ता है। – Squonk

+0

ओह, हाँ मुझे लगा कि यह एप्लिकेशन टैग के बाहर नहीं था :) –

4

में नीचे सहमति के बाद से नई runtime permission model एंड्रॉयड 6.0 में पेश किया जाता है ठीक करना चाहिए

आशा आप runtime permission model उपयोग करना चाहते हैं इस कोड को मदद मिलेगी। आप विवरण कार्यान्वयन भी देख सकते हैं और 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

यह दिखा रहा है java.lang.ArrayIndexOutOfBoundsException: length = 0; अनुक्रमणिका = 0 –

1

मैं मूल रूप से आप केवल पहली छमाही आप अनुमति के लिए लोअरकेस "android.permission.READ_CONTACTS" बदलने की जरूरत है तुम्हारे पास क्या है की तरह एक ही स्थिति थी।

+0

<उपयोग-अनुमति एंड्रॉइड: name = "android.permission.READ_CONTACTS" /> –

संबंधित मुद्दे

 संबंधित मुद्दे