Есть одна большая ошибка, которую я вижу здесь:
String id = c.getString(c.getColumnIndex(ContactsContract.PhoneLookup._ID));
Вы не должны использовать PhoneLookup.XXX
столбцы при запросе к Phone.CONTENT_URI
, этот код фактически возвращает столбец Phone._ID
вместо этого (потому чтооба имеют одинаковое имя строки констант), которое НЕ является идентификатором контакта, это определенный идентификатор телефона (или Data._ID
).Вы также не можете получить доступ к столбцам из курсора, который вы не указали в своей проекции.
Поэтому измените вашу проекцию на:
String[] projection = {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
};
и замените эту строку на:
Long contactId = c.getLong(2);
Еще одна вещь, которую вы можете сделать, это упростить ваш второй запрос, выполнив запрос к StructuredPostal.CONTENT_URI
, например так:
String addrWhere = StructuredPostal.CONTACT_ID + " = " + contactId;
Cursor addrCur = getActivity().getContentResolver().query(StructuredPostal.CONTENT_URI, null, addrWhere, null, null);
Обратите внимание, что в отличие от вашего первого запроса информации Phone.NUMBER
, выприложению необходимо READ_CONTACTS
разрешение на второй запрос адреса, это потому, что вы запрашиваете намерение выбора телефона, которое предоставляет вашему приложению временную привязку.разрешение на доступ к выбранному номеру телефона только из API контактов, кроме того, что требует разрешения.