Получить адрес в контактах с помощью 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, то здесь показаны некоторые примеры извлечения информации из контакта, то есть, если вы еще не поняли это.

Удачи.

Другие вопросы по тегам