【问题标题】:permission.READ_CONTACTS does not seem to workpermission.READ_CONTACTS 似乎不起作用
【发布时间】:2011-12-27 15:12:45
【问题描述】:

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

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);  

我尝试将&lt;uses-permission android:name="android.permission.READ_CONTACTS" /&gt;android:permission="android.permission.READ_CONTACTS" 添加到&lt;application&gt;&lt;activity&gt;,但均无效。

我的选项不多了,有人知道我在这里缺少什么吗?

【问题讨论】:

  • 检查你是否允许你的安卓手机设置权限!!

标签: android permissions android-contacts


【解决方案1】:

&lt;uses-permission&gt; 应该包含在&lt;manifest&gt; 元素中。见Structure of the Manifest File。所以尝试将其放入&lt;application&gt;&lt;activity&gt; 是行不通的。无奈之举:尝试在&lt;application&gt;之前移动&lt;uses-sdk&gt;

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

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

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

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

【讨论】:

  • 感谢您的回答,我首先将&lt;uses-sdk android:minSdkVersion="8" /&gt; 一直向上移动,但没有帮助。接下来我删除了除 READ_CONTACTS 之外的所有权限,不幸的是这也不起作用
  • 嗨,我编辑了我的答案。我不确定您是否已发布所有清单,或仅部分。无论如何,许可声明是正确的。您可以尝试在清单上运行“验证”吗?
  • 我的错,我打算发布我的整个清单,显然我忘记了第一行。我编辑了我的问题并添加了第一行。
  • 我运行了“验证”,它说“完成了一个警告”。关于“没有语法限制”的东西。不要认为这会导致这种行为
  • 你是对的,这应该没问题。嗯,你有没有试过清理项目,重启模拟器/IDE?
【解决方案2】:

直到我读到 this article 关于如何从 SDK 23 开始处理权限之前,我完全陷入了困境。关键提示:

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

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

【讨论】:

  • 这是给我的,谢谢! (Android 抛出的异常中的错误信息不是很有用。)我们选择正确实现请求运行时权限,因此official docs 最终是最有用的资源。
  • “从 2018 年 8 月 1 日起,Google Play 将要求新应用至少面向 Android 8.0(API 级别 26),并且从 2018 年 11 月 1 日起,应用更新面向 Android 8.0。”所以这是一个不适用于新应用程序的hack。更好的选择是使用 Alon Kogan 编写的内容,并在运行时处理权限请求。见developer.android.com/training/permissions/requesting
【解决方案3】:

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

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

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

只有在审核通过后,您才能查询联系人的电话号码/姓名等。

【讨论】:

【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    我遇到了同样的问题,直到我添加了WRITE_EXTERNAL_STORAGE 权限和READ_CONTACTS 权限之前,我阅读的解决方案都没有帮助解决它。

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

    【讨论】:

    • 知道你为什么需要它吗?
    【解决方案6】:

    我今天遇到了这个问题,以上修复都没有为我工作。

    问题最终与我的 Eclipse 有什么关系。我在manifest.xml 中写的内容与Permissions 标签中的内容不一样。我的manifest.xml 中有READ_CONTACTS 权限,但READ_PROFILE 在我的权限选项卡下。

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

    谢谢!

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 2016-02-01
      • 2020-09-23
      • 2010-12-05
      • 2011-06-14
      • 2015-01-10
      • 2016-02-24
      • 2011-01-18
      • 2018-06-20
      相关资源
      最近更新 更多