Вопрос

Я пытаюсь получить имя, номер телефона и адрес контакта из списка контактов Android.Имя и телефон довольно просты, но адрес, похоже, недоступен на уровне API 1.6.

Кто-нибудь понял, как получить адрес контакта?Также в версии 2.0 появился совершенно новый API.Как я могу воспользоваться этим и вернуться к старому API, используя 1 двоичный файл.Если это вообще возможно.

Это было полезно?

Решение

До 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, вы можете вызвать API 2.0 без необходимости отражения.Вам просто нужно быть ОЧЕНЬ осторожным, чтобы классы, зависящие от классов 2.0, не загружались в устройство 1.6, иначе загрузчик классов выдаст ошибку.Чтобы избежать этого, вам нужно будет использовать какую-то фабрику для разрыва зависимостей (или инфраструктуру DI, например Guice).Видеть это размещение для дальнейшего обсуждения.

Другие советы

Спасибо Энтони Форлони (ниже) за ссылку "как читать контакты", это было полезно.Чтобы расширить содержание эта ссылка , с кодом чтения "адреса" эти строки должны помочь!Как видите, они должны получить почтовый адрес, выполнив запрос с помощью СтруктурированнаяПочтовая константы.

            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();

Остальная часть эта ссылка действительно извлекает имя и телефоны (когда вы исправляете ошибку «имеет номер телефона» для логического значения - логическое значение не анализируется должным образом)

На моем телефоне в банкомате, но здесь это ссылка с вопросом, похожим на ваш.

Я надеюсь, что это поможет или укажет вам в правильном направлении.

РЕДАКТИРОВАТЬ:

Я уже упоминал, что я бы отредактировал свой первоначальный ответ, по крайней мере, в соответствии с тем, что вы искали, это, вероятно, очень поздно, и у вас уже есть ответ, но вот дополнительная информация, если вы все еще ищете что-то, что вам нужно искать является КонтактыContract.CommonDataKinds.StructuredPostal и вы можете извлечь конкретную информацию об адресе.Что касается примера с использованием Android 2.0 здесь показывает несколько примеров извлечения информации из контакта, если вы еще этого не поняли.

Удачи.

вот как я это сделал с 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top