【问题标题】:Why does querying contact picker require different permissions depending on the android version?为什么查询联系人选择器需要根据android版本不同的权限?
【发布时间】:2025-12-07 02:50:01
【问题描述】:

我们一直在试验 Android 联系人选择器,以允许用户选择联系人,而无需应用需要 READ_CONTACTS 权限。以下意图似乎适用于 4.0 (ICS) 设备以及 2.3.3 模拟器:

Intent contactPickerIntent = new Intent(Intent.ACION_GET_CONTENT);
contactPickerIntent.setType(Phone.CONTENT_ITEM_TYPE); // returns content://com.android.contacts/data/...

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); // returns content://com.android.contacts/lookup/...

但是,在 2.2 模拟器和某些 ICS 之前的型号(例如 HTC Thunderbolt、Motorola Droid)上,尝试查询返回的 UI 会导致权限拒绝异常:

原因:java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts/lookup/0r1-52345052324E483C32/1 从 pid=273, uid=10036 需要 android.permission.READ_CONTACTS

这看起来像是操作系统或设备碎片问题;我们正在寻求对此主题的澄清,以便我们可以采用这种方法或替代方法。

想法?

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    这是故意的。在this page 的底部记录了这种行为:

    在 Android 2.3(API 级别 9)之前,对联系人提供程序(如上图所示)执行查询需要您的应用声明 READ_CONTACTS 权限(请参阅安全和权限)。但是,从 Android 2.3 开始,Contacts/People 应用程序会在您返回结果时授予您的应用程序从 Contacts Provider 读取的临时权限。临时权限仅适用于请求的特定联系人,因此您不能查询除意图的Uri 指定的联系人以外的联系人,除非您声明了READ_CONTACTS 权限。

    您希望在其他十几个地方记录这一点,但该页面是我发现它解释的唯一地方。

    【讨论】:

      最近更新 更多