permission.READ_CONTACTS似乎不起作用

时间:2011-11-12 13:41:44

标签: android permissions android-contacts

我正在开发一个浏览用户联系人的简单应用程序。不幸的是,我一直收到以下错误:

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

我的清单文件如下:

<?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>

我试图通过以下方式查看我的联系人:

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

我尝试将<uses-permission android:name="android.permission.READ_CONTACTS" />android:permission="android.permission.READ_CONTACTS"添加到<application><activity>,但两者都无效。

我的选项已经用完了,有人知道我在这里缺少什么吗?

6 个答案:

答案 0 :(得分:16)

<uses-permission>应包含在<manifest>元素中。见Structure of the Manifest File。因此,尝试将其放入<application><activity>,将无效。绝望移动:尝试在<uses-sdk>

之前移动<application>
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

此外,如果您可以在没有其他权限的情况下进行测试,请将其删除。

编辑:请你检查一下你的清单文件中是否是你的TOP行:

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

答案 1 :(得分:9)

我完全坚持这一点,直到我从SDK 23开始阅读this article关于如何处理权限的问题。关键提示:

  

如果应用程序的targetSdkVersion设置为小于23.将假设应用程序尚未使用新的权限系统进行测试,并将切换到相同的旧行为:用户必须在安装时接受每个权限,他们将一旦安装就全部授予!

我打开了我的gradle.build文件并将targetSdkVersion 23更改为targetSdkVersion 22,现在一切正常!我最终会抽出时间来构建新的权限系统并切换回targetSdkVersion 23,这可能是更正确的答案。这是一个临时捷径。

答案 2 :(得分:4)

在你的on create方法

中试试这个

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

答案 3 :(得分:4)

以上都没有帮助。解决方案非常简单。 您需要一个运行时权限请求。

无论是否在您的清单中放置权限,您都需要即时向用户请求该权限。 if( getApplicationContext().checkSelfPermission( Manifest.permission.READ_CONTACTS ) != PackageManager.PERMISSION_GRANTED ) ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, resultValue);

只有在获得批准后,您才能查询联系人电话号码/姓名等。

答案 4 :(得分:3)

我遇到了同样的问题,在我添加WRITE_EXTERNAL_STORAGE权限和READ_CONTACTS权限之前,我读过的所有解决方案都没有帮助解决这个问题。

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

答案 5 :(得分:0)

我今天遇到了这个问题,上述修复都没有对我有用。

问题最终与我的Eclipse有什么关系。我在manifest.xml中写的内容和Permissions标签中的内容并不相同。我的READ_CONTACTS获得了manifest.xml权限,但READ_PROFILE位于我的许可标签下。

我知道这是一个旧帖子,但希望如果有人遇到同样的问题,我会发现他们会遇到这个问题。

谢谢!