permission.READ_CONTACTS 似乎不起作用

问题描述 投票:0回答:7

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

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>
,但都不起作用。

我已经没有选择了,有人知道我在这里缺少什么吗?

android permissions android-contacts
7个回答
18
投票

<uses-permission>
应包含在
<manifest>
元素中。请参阅清单文件的结构。因此尝试将其放入
<application>
<activity>
中是行不通的。绝望之举:尝试在
<uses-sdk>
之前移动
<application>

<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

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

编辑:您能否检查一下这是否是清单文件中的第一行:

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

10
投票

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

无论是否在清单中添加许可,您都需要即时向用户请求该许可。

if( getApplicationContext().checkSelfPermission( Manifest.permission.READ_CONTACTS ) != PackageManager.PERMISSION_GRANTED )
     ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, resultValue);

审核通过后您才可以查询联系人电话/姓名等


9
投票

我完全陷入了这个困境,直到我阅读了这篇文章,了解如何从 SDK 23 开始处理权限。关键提示:

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

我打开了我的

gradle.build
文件并将
targetSdkVersion 23
更改为
targetSdkVersion 22
,现在一切都很好!我最终会找到时间构建新的权限系统并切换回
targetSdkVersion 23
,这可能是更正确的答案。这是临时快捷方式。


8
投票

在你的 on create 方法中尝试这个

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

3
投票

我遇到了同样的问题,我阅读的解决方案都无法帮助解决该问题,直到我添加

WRITE_EXTERNAL_STORAGE
权限以及
READ_CONTACTS
权限。

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

0
投票

我今天遇到了这个问题,以上修复方法都对我不起作用。

问题最终与我的 Eclipse 有关。我在

manifest.xml
中写的内容和
Permissions
选项卡中的内容不一样。我在我的
READ_CONTACTS
中拥有
manifest.xml
权限,但
READ_PROFILE
位于我的权限选项卡下的位置。

我知道这是一个旧线程,但希望如果有人遇到与我相同的问题,他们会偶然发现这一点。

谢谢!


0
投票

为我工作,使用运行时权限访问联系人

© www.soinside.com 2019 - 2024. All rights reserved.