permission.READ_CONTACTS似乎不起作用

Dan*_*lvd 17 permissions android 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
Run Code Online (Sandbox Code Playgroud)

我的清单文件如下所示:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);  
Run Code Online (Sandbox Code Playgroud)

我试图添加<uses-permission android:name="android.permission.READ_CONTACTS" />android:permission="android.permission.READ_CONTACTS"<application><activity>,但都没有奏效.

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

hov*_*yan 17

<uses-permission>应包含在<manifest>元件.请参阅清单文件的结构.因此,尝试将其放入<application><activity>将无法正常工作.绝望之举:尝试<uses-sdk>前移动<application>

<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
Run Code Online (Sandbox Code Playgroud)

此外,如果您可以在没有其他权限的情

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

<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)


小智 9

直到我读到有关如何从SDK 23开始处理权限的文章之前,我完全坚持这一点.关键提示:

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

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


Alo*_*gan 7

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

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

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

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


小智 6

在你的创建方法中试试这个

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1);
Run Code Online (Sandbox Code Playgroud)