Проблема в том, что все вложенные таблицы, к которым вы пытаетесь получить доступ (Email
, Phone
, Website
и т. Д.), На самом деле все хранятся в одной большой таблице с именем Data
.
Все эти вложенные таблицы имеют одни и те же поля Data1-Data15, поэтому, запрашивая таблицу Phone.CONTENT_URI
, вы получаете только информацию Phone
, поэтому попытка получить доступ к StructuredName.GIVEN_NAME
для результата неверна.
Вместо этого вы запрашиваете таблицу Data.CONTENT_URI
, которая содержит всю информацию, и вы различаете строки разных типов данных по значению Data.MIMETYPE
.
См. Документы здесь: https://developer.android.com/reference/android/provider/ContactsContract.Data
Я не уверен, нужна ли вам информация о контакте для всех контактов на устройстве или для конкретного.
Вот код для получения информации об одном контакте (вам нужно присвоить значение переменной contactId
)
String[] projection = {Data.CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3};
// query only emails/phones/events
String selection = Data.CONTACT_ID + "=" + contactId + " AND " +
Data.MIMETYPE + " IN ('" + StructuredName.CONTENT_ITEM_TYPE + "', '" + Phone.CONTENT_ITEM_TYPE + "', '" + Email.CONTENT_ITEM_TYPE"', '" + Website.CONTENT_ITEM_TYPE + "')";
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);
while (cur.moveToNext()) {
long id = cur.getLong(0);
String name = cur.getString(1); // full name
String mime = cur.getString(2); // type of data (phone / birthday / email)
String data = cur.getString(3); // the actual info, e.g. +1-212-555-1234
String kind = "unknown";
switch (mime) {
case StructuredName.CONTENT_ITEM_TYPE:
String firstName = cur.getString(4);
String lastName = cur.getString(5);
Log.d(TAG, "got name: " + data + " - " + firstName + " " + lastName);
break;
case Phone.CONTENT_ITEM_TYPE:
Log.d(TAG, "got phone: " + data);
break;
case Email.CONTENT_ITEM_TYPE:
Log.d(TAG, "got email: " + data);
break;
case Website.CONTENT_ITEM_TYPE:
Log.d(TAG, "got website: " + data);
break;
}
}
cur.close();
Чтобы преобразовать его для запуска по ВСЕМ контактам, просто удалите часть Data.CONTACT_ID + "=" + contactId
из selection
, а затем вам нужно будет создать HashMap из contactId для объекта, содержащего информацию об этом контакте (используйте id
переменная для ключа)