尝试访问Android中的联系人时拒绝访问权限

我尝试访问设备上的联系人,然后将其显示在列表中,但是当我尝试使用游标访问它们时,出现一个错误,我缺lessREAD_CONTACTS权限,但是我已经在AndroidManifest中授予了权限.XML

代码在哪里我访问联系人:

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) 

任何帮助将不胜感激!

Solutions Collecting From Web of "尝试访问Android中的联系人时拒绝访问权限"

在应用程序标签之外添加uses-permission,并使android.permission小写。 那应该按照下面在意见中同意的那样来解决

由于Android 6.0引入了新的运行时权限模型 ,

如果你想使用运行时权限模型,希望这段代码能够帮到你。 你也可以看到细节的实现,并从这里获取源代码。

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

在这里输入图像说明

在这里输入图像说明

我有像你有什么相同的情况,基本上你只需要改变“android.permission.READ_CONTACTS”为小写你的上半年的权限。