Получить RawContactId конкретного контакта на основе PhoneLookup

Я ищу, чтобы получить RAW_CONTACT_ID конкретного Contact с помощью PhoneLookup или даже просто Contacts LookupKey.

Я знаю, что в таблице контактов есть столбец name_raw_contact_id что ссылается на 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);

Тем не менее, это не компилируется, и я получаю

cannot find symbol: variable NAME_RAW_CONTACT_ID 
location: class android.provider.ContactsContract.Contacts

Но андроид документация показывает NAME_RAW_CONTACT_ID как столбец.

Есть ли способ, которым я могу получить RAW_CONTACT_ID на основании номера телефона или ключа поиска?

3 ответа

Решение

Я обнаружил, что ответ состоит в том, чтобы сделать третий запрос:

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 для одного контакта, и вышеупомянутый запрос получит ВСЕ RawContact, связанные с contactId

Столбцу ContactsContract.Contacts.NAME_RAW_CONTACT_ID требуется API уровня 21 или выше, поэтому убедитесь, что вы компилируете с этой версией.
Также вы можете использовать столбец ContactsContract.PhoneLookup._ID в первом запросе, чтобы получить Contact_Id, а затем использовать этот Contact_Id в своем 3-м запросе, чтобы ваша проблема была решена в 2 запросах вместо 3.

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;
}
Другие вопросы по тегам