【问题标题】:Accessing contacts info without explicit permission未经明确许可访问联系人信息
【发布时间】:2017-02-24 01:12:27
【问题描述】:

我对应用程序开发非常陌生。我正在尝试读取联系人信息,而无需请求联系人的权限(因此我正在使用意图)。

我在我的主要活动中获得了一个包含以下代码的 URI:

Intent selectContactIntent = new Intent(Intent.ACTION_PICK);
selectContactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE);
if (selectContactIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(selectContactIntent, REQUEST_CODE_SELECT_CONTACT);
}
else {
    showContactRequiredMessage(view);
}

在另一个(子)活动中,我执行以下操作:

contactUri = intent.getParcelableExtra(MainActivity.CONTACT_URI);

String[] projection = new String[] {
        ContactsContract.Contacts.Data._ID,
        ContactsContract.Contacts.Data.MIMETYPE,
        ContactsContract.Contacts.Data.DATA1,
        ContactsContract.Contacts.Data.DATA2,
        ContactsContract.Contacts.Data.DATA3,
        ContactsContract.Contacts.Data.DATA4,
        ContactsContract.Contacts.Data.DATA5,
        ContactsContract.Contacts.Data.DATA6,
        ContactsContract.Contacts.Data.DATA7,
        ContactsContract.Contacts.Data.DATA8,
        ContactsContract.Contacts.Data.DATA9,
        ContactsContract.Contacts.Data.DATA10,
        ContactsContract.Contacts.Data.DATA11,
        ContactsContract.Contacts.Data.DATA12,
        ContactsContract.Contacts.Data.DATA13,
        ContactsContract.Contacts.Data.DATA14,
        ContactsContract.Contacts.Data.DATA15
};
Cursor contactResults = getContentResolver().query(contactUri, projection, null, null, null);

最后一行抛出异常java.lang.IllegalArgumentException: Invalid column <any column after _ID>

我的应用实际上不需要所有数据,我只是想看看可用的数据,我很可能需要名字、姓氏、电话和电子邮件。

【问题讨论】:

  • 在那个问题中接受的答案实际上是让我达到现在这一点的原因。如果我尝试使用那里找到的代码 sn-p 结果是一样的,就会抛出异常。

标签: android android-permissions android-contacts


【解决方案1】:

我的问题是我在请求联系信息时在意图上设置的 MIME 类型。应该使用documentation 状态ContactsContract.Contacts.CONTENT_TYPE。但是,如果我使用 ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE 之类的东西,我可以获得显示名称和电话号码。我不确定这是否意味着我需要进行多次查询才能获取所有内容(更改请求的类型时,联系人选择器中显示的信息会发生变化)。

TL;DR:在创建选择联系人的意图时使用了“错误”的内容类型。

【讨论】:

  • 我不认为你一开始就错了,文档清楚地说明了两个选项:(1) 使用Contacts.CONTENT_TYPE 来获取温度。使用CommonDataKinds...CONTENT_TYPEs 之一访问联系人的所有字段或(2) 访问特定字段。您可以使 (2) 正常工作,但 (1) 也应该正常工作,但可能使用不同的 api
【解决方案2】:

正如我在对您的回答的评论中提到的,您应该能够在不使用特定的 CONTENT_TYPE(如 CommonDataKinds.Phone.CONTENT_TYPE)的情况下获得预期的信息。

我在您的代码中看到的问题是您试图从 Contacts 表 uri 访问 Data 表信息。

ContactsContract api 将信息存储在 3 个主表上:Contacts、RawContacts 和 Data。 给你一个contactUri,它指向Contacts表中的一个条目,使用以下代码读取与该联系人相关的数据条目:

long contactId = ContentUris.parseId(contactUri);
String projection = String[] { Data.MIMETYPE, Data.DISPLAY_NAME, Data.DATA1 };
String selection = Data.CONTACT_ID + " = " + contactId;
Cursor cursor = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, null);

while (cursor != null && cursor.moveToNext()) {
  String mime = cursor.getString(0);
  String name = cursor.getString(1);
  String info = cursor.getString(2);
  if (mime.equals(CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
     Log.d(TAG, name + ": email = " + info;
  }
  if (mime.equals(CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
     Log.d(TAG, name + ": phone = " + info;
  }
  // Add more mimetypes here if needed...
}
if (cursor != null) {
  cursor.close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多