Получить адрес в контактах с помощью Android SDK - PullRequest
1 голос
/ 06 декабря 2009

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

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

Ответы [ 4 ]

7 голосов
/ 07 декабря 2009

До 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). См. сообщение для дальнейшего обсуждения.

3 голосов
/ 22 октября 2010

Спасибо Энтони Форлони ( ниже ) за ссылку «как читать контакты», которая была полезной. Чтобы расширить содержание этой ссылки , с кодом того, как читать «адрес», эти строки должны помочь! Как вы видите, они должны получить почтовый адрес, выполнив запрос с использованием 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();

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

1 голос
/ 25 июля 2011

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

1 голос
/ 06 декабря 2009

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

Надеюсь, это поможет или направит вас в правильном направлении.

EDIT:

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

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...