Получить адрес в контактах с помощью Android SDK
Я пытаюсь получить имя контакта, номер телефона и адрес из списка контактов Android. Название и телефон довольно просты, но адрес, кажется, не доступен с уровнем API 1.6.
Кто-нибудь разобрался, как узнать адрес контакта? Также есть абсолютно новый API в 2.0. Как я могу воспользоваться этим и отступить к старому API, используя 1 двоичный файл. Если это даже возможно.
4 ответа
До Android 2.0 вам нужно запросить Contacts.ContactMethods.CONTENT_URI, чтобы получить почтовые адреса, которые вам нужно будет передать
Contacts.ContactMethods.PERSON_ID + "=? and " + Contacts.ContactMethods.KIND + "=?"
для выбора и для параметра selectArgs:
new String[] { personId, Integer.toString(Contacts.KIND_POSTAL) }
Начиная с версии 2.0 вы используете новый ContactsContract, который намного сложнее, потому что контакт теперь может собирать информацию из нескольких источников. Несколько хороших групповых публикаций по новому API здесь и здесь.
Рекомендуемый способ нацеливания на несколько API-интерфейсов платформ из одного и того же двоичного файла - использовать отражение (см. Этот блог). Я обнаружил, что если в манифесте вы нацеливаете свое приложение на 1.6 или ниже, но устанавливаете путь сборки, чтобы выбрать jar-файл Android 2.0, вы можете вызвать 2.0 apis без необходимости размышлений. Вам просто нужно быть ОЧЕНЬ осторожным, чтобы классы, которые зависят от классов 2.0, не загружались в устройство 1.6, иначе загрузчик классов сработает. Чтобы избежать этого, вам нужно будет использовать какую-то фабрику для разрыва зависимостей (или DI-фреймворк, такой как Guice). Смотрите эту публикацию для дальнейшего обсуждения.
Спасибо Энтони Форлони ( ниже) за ссылку "как читать контакты", это было полезно. Чтобы расширить содержание этой ссылки, с кодом того, как читать "адрес", эти строки должны помочь! Как вы видите, они должны получить почтовый адрес, выполнив запрос с использованием констант StructuredPostal.
Cursor postals = getContentResolver().query(
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = "
+ contactId, null, null);
int postFormattedNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS);
int postTypeNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE);
int postStreetNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET);
while (postals.moveToNext()) {
String postalData = postals.getString(postFormattedNdx);
postalCat = postalCat+ postalData+ ", [";
postalData = String.valueOf(postals.getInt(postTypeNdx));
postalCat = postalCat+ postalData+ "], ";
postalData = postals.getString(postStreetNdx);
postalCat = postalCat+ postalData+ " ";
}
postals.close();
Остальная часть этой ссылки действительно извлекает имя и телефоны (когда вы исправляете ошибку "имеет номер телефона" для логического значения - логическое значение не анализируется должным образом)
Вот как я это сделал с Android 2.3.3:
String where = ContactsContract.Data._ID + " = "
+ uriData.getLastPathSegment()
+ " AND ContactsContract.Data.MIMETYPE = '"
+ ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE
+ "'";
String[] projection = new String[] { StructuredPostal.STREET,
StructuredPostal.CITY,
StructuredPostal.REGION,
StructuredPostal.POSTCODE,
StructuredPostal.COUNTRY};
Cursor cursor = getContentResolver().query( ContactsContract.Data.CONTENT_URI,
projection,
where,
null,
null);
String strOutput = "";
if (cursor.moveToFirst())
{
strOutput += "\n" + cursor.getString(0);
strOutput += "\n" + cursor.getString(1);
strOutput += "\n" + cursor.getString(2);
strOutput += "\n" + cursor.getString(3);
strOutput += "\n" + cursor.getString(4);
}
cursor.close();
ПРИМЕЧАНИЕ: uriData
получается путем захвата намерения просмотреть адрес. Это решается здесь: Какое намерение связано с "Просмотр рабочего адреса" в Контактах / Карточке контакта?
Вместо _ID
не стесняйтесь попробовать ContactsContract.Data.CONTACT_ID
На моем телефоне атм, но вот ссылка с вопросом, похожим на ваш.
Я надеюсь, что это помогает или указывает вам в правильном направлении.
РЕДАКТИРОВАТЬ:
Я упомянул, я бы изменил свой первоначальный ответ, по крайней мере, в соответствии с тем, что вы искали, возможно, это уже поздно, и у вас уже есть ваш ответ, но здесь есть дополнительная информация, если вы все еще ищете что-то, что вам нужно искать это http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.StructuredPostal.html, и вы можете извлечь конкретные детали, касающиеся адреса. Что касается примера использования Android 2.0, то здесь показаны некоторые примеры извлечения информации из контакта, то есть, если вы еще не поняли это.
Удачи.