从PhoneLookup获取特定联系人的RawContactId

时间:2012-01-26 00:01:41

标签: android android-contacts

我希望使用RAW_CONTACT_ID或甚至联系人LookupKey获取特定Contact的{​​{1}}。

我知道contacts表有一个引用PhoneLookup列的列name_raw_contact_id,但在使用contacts查询键查询raw_contacts._id时似乎没有返回。

我的手机查询查询是:

ContactsContract.Contacts.CONTENT_LOOKUP_URI

然后我根据查找键查找String[] projection = new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup.LOOKUP_KEY }; Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); Cursor c = resolver.query(uri, projection, null, null, null);

Contact

然而,这不会编译,我得到

String[] contactProjection = new String[] { 
    ContactsContract.Contacts.NAME_RAW_CONTACT_ID 
};
Uri contactUri = Uri.withAppendedPath(
    ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
Cursor contactCursor = resolver.query(contactUri, 
    contactProjection, null, null, null);

但是android documentationcannot find symbol: variable NAME_RAW_CONTACT_ID location: class android.provider.ContactsContract.Contacts 显示为列。

有什么方法可以根据电话号码或查找密钥获取NAME_RAW_CONTACT_ID吗?

3 个答案:

答案 0 :(得分:2)

我发现答案是提出第三个问题:

long rawContactId = -1;
Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,
    new String[]{RawContacts._ID},
    RawContacts.CONTACT_ID + "=?",
    new String[]{String.valueOf(contactId)}, null);
try {
    if (c.moveToFirst()) {
        rawContactId = c.getLong(0);
    }
} finally {
    c.close();
}

但是应该注意每个联系人可以有多个RawContact,上面的查询将获得与contactId

相关联的所有RawContact

答案 1 :(得分:1)

ContactsContract.Contacts.NAME_RAW_CONTACT_ID列需要 API级别21 或更高版本,因此请确保您使用此版本进行编译。
您还可以在第一个查询中使用 ContactsContract.PhoneLookup._ID 列来获取 Contact_Id ,然后使用此 Contact_Id 在您的第3个查询中,您的问题将在2个查询中解决,而不是3个。

答案 2 :(得分:0)

private HashSet<Long> getRawContactIdsForContact(long contactId)
{
    HashSet<Long> ids = new HashSet<Long>();

    Cursor cursor = context.getContentResolver().query(RawContacts.CONTENT_URI,
              new String[]{RawContacts._ID},
              RawContacts.CONTACT_ID + "=?",
              new String[]{String.valueOf(contactId)}, null);

    if (cursor != null && cursor.moveToFirst())
    {
        do
        {
            ids.add(cursor.getLong(0));
        } while (cursor.moveToNext());
        cursor.close();
    }

    return ids;
}