我正在开发一个浏览用户联系人的简单应用程序。不幸的是,我一直收到以下错误:
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>
,但两者都无效。
我的选项已经用完了,有人知道我在这里缺少什么吗?
答案 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
位于我的许可标签下。
我知道这是一个旧帖子,但希望如果有人遇到同样的问题,我会发现他们会遇到这个问题。
谢谢!