代码之家  ›  专栏  ›  技术社区  ›  Bostjan

Android联系人查询

  •  3
  • Bostjan  · 技术社区  · 15 年前

    我在查询电话簿联系人时遇到问题。我需要做的是得到一个联系人名单,既有电话和电子邮件输入或是一个特定的类型。

    基本上是这样的:

    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

    有人能帮我吗?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Pentium10    15 年前

    读取原始联系人及其所有相关数据的最佳方法是使用 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是 Phone.CONTENT_ITEM_TYPE ,然后是列 DATA1 存储电话号码,但如果数据类型为 Email.CONTENT_ITEM_TYPE ,那么 数据1 存储电子邮件地址。

    HAS_PHONE_NUMBER

        2
  •  1
  •   Gawcio    15 年前

    也许你应该用 Email.CONTENT_URI 因为它包含 "vnd.android.cursor.item/email_v2" 关联原始联系人 .