Получить 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;
}