我正在开发一个简单的应用程序,可以浏览用户的联系人。不幸的是我不断收到以下错误:
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>
,但都不起作用。
我已经没有选择了,有人知道我在这里缺少什么吗?
<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"?>
以上都没有帮助。解决方案非常简单。 您需要运行时权限请求。
无论是否在清单中添加许可,您都需要即时向用户请求该许可。
if( getApplicationContext().checkSelfPermission( Manifest.permission.READ_CONTACTS ) != PackageManager.PERMISSION_GRANTED )
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, resultValue);
审核通过后您才可以查询联系人电话/姓名等
我完全陷入了这个困境,直到我阅读了这篇文章,了解如何从 SDK 23 开始处理权限。关键提示:
如果应用程序的 targetSdkVersion 设置为小于 23。将假定应用程序尚未使用新的权限系统进行测试,并将切换到相同的旧行为:用户必须在安装时接受每个权限,并且它们将全部安装后即授予!
我打开了我的
gradle.build
文件并将 targetSdkVersion 23
更改为 targetSdkVersion 22
,现在一切都很好!我最终会找到时间构建新的权限系统并切换回 targetSdkVersion 23
,这可能是更正确的答案。这是临时快捷方式。
在你的 on create 方法中尝试这个
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1);
我遇到了同样的问题,我阅读的解决方案都无法帮助解决该问题,直到我添加
WRITE_EXTERNAL_STORAGE
权限以及 READ_CONTACTS
权限。
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我今天遇到了这个问题,以上修复方法都对我不起作用。
问题最终与我的 Eclipse 有关。我在
manifest.xml
中写的内容和 Permissions
选项卡中的内容不一样。我在我的 READ_CONTACTS
中拥有 manifest.xml
权限,但 READ_PROFILE
位于我的权限选项卡下的位置。
我知道这是一个旧线程,但希望如果有人遇到与我相同的问题,他们会偶然发现这一点。
谢谢!
为我工作,使用运行时权限访问联系人