(у меня нет необходимой репутации, чтобы комментировать, поэтому я должен добавить ответ)
Ответ TomTasche вводит в заблуждение, и я потратил много времени, пытаясь понять, почему я не могу получить правильное прозвище для контакта, который, как я знал, имел контакт.
Я нашел ответ сам, но получил от этого поста подтверждение , что я сейчас делаю это правильно.
В основном, когда вы читаете документацию ContactsContract.Data , которую вы читаете:
Каждая строка таблицы данных обычно используется для хранения одного фрагмента контактной информации (такой как номер телефона) и связанных с ней метаданных (например, является ли это рабочий или домашний номер).
Это объясняет теневую часть кода TomTasche:
if (nickname.equals(incomingNumber)) {
return name;
}
Поскольку поиск только с CONTACT_ID может возвращать несколько строк (по одной для каждого типа информации), не гарантируется, что первая содержит псевдоним. Когда есть псевдоним, он будет в DATA1, но номер телефона также найден в DATA1.
Пример части в документации ContactsContract.Data проясняет, что строки должны выбираться на основе их MIME_TYPE, только когда выбран MIME_TYPE, мы можем начать осмысливать содержимое в строке сам по себе.
Следовательно, правильный запрос будет:
cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[]{Nickname.NAME},
ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + "= ?",
new String[]{contactID, Nickname.CONTENT_ITEM_TYPE},
null);
(где никнейм ContactsContract.CommonDataKinds.Nickname )
Я чувствовал, что должен был что-то сказать по этой теме, чтобы другие люди не тратили столько же времени, как я, основываясь на этой единственной теме (первую, которую я нашел с моим другом из Google).