Android联系人查询

时间:2010-06-23 08:55:21

标签: android android-contacts phone-number

我在查询电话簿联系人时遇到问题。我需要做的是获得一个联系人列表,其中包含电话和电子邮件输入或具有特定类型。

基本上是这样的:

public static final String SELECTION =
    "("+ContactsContract.Contacts.HAS_PHONE_NUMBER +"='1') OR " + RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'";

现在问题是,RawContacts.ACCOUNT_TYPE中不存在ContactsContract.Contacts.CONTENT_URI,我在查询中使用{{1}}。我猜我需要加入另一张桌子,但不知道怎么做。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

读取原始联系人以及与之关联的所有数据的最佳方法是使用ContactsContract.RawContacts.Entity目录。如果原始联系人具有数据行,则实体游标将包含每个数据行的行。如果原始联系人没有数据行,则游标仍将包含一行,其中包含原始联系人级别信息。

Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
 Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);
 Cursor c = getContentResolver().query(entityUri,
          new String[]{RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1},
          null, null, null);
 try {
     while (c.moveToNext()) {
         String sourceId = c.getString(0);
         if (!c.isNull(1)) {
             String mimeType = c.getString(2);
             String data = c.getString(3);
             //decide here based on mimeType, see comment later
         }
     }
 } finally {
     c.close();
 }

您必须根据mimeType

过滤结果

例如,如果mimeType为Phone.CONTENT_ITEM_TYPE,则列DATA1会存储电话号码,但如果数据种类为Email.CONTENT_ITEM_TYPE,则DATA1会存储该电子邮件地址。

这样您就不必使用HAS_PHONE_NUMBER,因为您将直接通过项目进行迭代。

答案 1 :(得分:1)

也许您应该使用Email.CONTENT_URI,因为它包含"vnd.android.cursor.item/email_v2" MIME类型的所有数据记录,并结合关联的原始联系人汇总联系人数据