получить ник контакта - PullRequest
4 голосов
/ 16 июня 2010

Я хочу получить псевдоним контакта из адресной книги.Я начинаю с его номера телефона, запрашиваю его и в результате хочу получить псевдоним (он же псевдоним).

Cursor cur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.NUMBER + " = " + incomingNumber, null, null);

        if (cur.moveToFirst()) {
            Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME)));
            Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.LABEL)));
        }

Выходные данные журналов - входящий номер (первый Log.e ()) и ноль (второй журнал.e ()), но я хочу получить псевдоним контакта!

Спасибо, Том

Ответы [ 3 ]

4 голосов
/ 16 июня 2010

Псевдоним хранится в таблице, отличной от телефонных номеров, вы должны запросить ContactsContract.Data.CONTENT_URI

Проверьте мой ответ на этот вопрос

2 голосов
/ 29 мая 2014

(у меня нет необходимой репутации, чтобы комментировать, поэтому я должен добавить ответ)

Ответ TomTasche вводит в заблуждение, и я потратил много времени, пытаясь понять, почему я не могу получить правильное прозвище для контакта, который, как я знал, имел контакт.

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

В основном, когда вы читаете документацию ContactsContract.Data , которую вы читаете:

Каждая строка таблицы данных обычно используется для хранения одного фрагмента контактной информации (такой как номер телефона) и связанных с ней метаданных (например, является ли это рабочий или домашний номер).

Это объясняет теневую часть кода TomTasche:

if (nickname.equals(incomingNumber)) {
                return name;
            }

Поскольку поиск только с CONTACT_ID может возвращать несколько строк (по одной для каждого типа информации), не гарантируется, что первая содержит псевдоним. Когда есть псевдоним, он будет в DATA1, но номер телефона также найден в DATA1.

Пример части в документации ContactsContract.Data проясняет, что строки должны выбираться на основе их MIME_TYPE, только когда выбран MIME_TYPE, мы можем начать осмысливать содержимое в строке сам по себе.

Следовательно, правильный запрос будет:

cursor =  getContentResolver().query(
                ContactsContract.Data.CONTENT_URI,
                new String[]{Nickname.NAME},
                ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + "= ?",
                new String[]{contactID, Nickname.CONTENT_ITEM_TYPE},
                null);

(где никнейм ContactsContract.CommonDataKinds.Nickname )

Я чувствовал, что должен был что-то сказать по этой теме, чтобы другие люди не тратили столько же времени, как я, основываясь на этой единственной теме (первую, которую я нашел с моим другом из Google).

2 голосов
/ 17 июня 2010

Ответ от Pentium10 был очень полезным! Спасибо!

Если кому-то нужен образец, посмотрите на следующий код:

public String accessContact(String incomingNumber) {
        if (incomingNumber == null || "".equals(incomingNumber)) {
            return "unknown";
        }

        try {
            Cursor cur = context.getContentResolver().query(Phone.CONTENT_URI, new String[] {Phone.DISPLAY_NAME, Phone.TYPE, Phone.CONTACT_ID}, Phone.NUMBER + " = " + incomingNumber, null, null);

            int nameIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
            int typeIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
            int idIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);

            String name;
            String type;
            String id;

            if (cur.moveToFirst()) {
                name = cur.getString(nameIndex);
                type = cur.getString(typeIndex);
                id = cur.getString(idIndex);
            } else {
                return "unknown";
            }

            cur = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {ContactsContract.Data.DATA1}, ContactsContract.Data.CONTACT_ID + " = " + id, null, null);

            int nicknameIndex = cur.getColumnIndex(ContactsContract.Data.DATA1);
            String nickname;

            if (cur.moveToFirst()) {
                nickname = cur.getString(nicknameIndex);
                if (nickname.equals(incomingNumber)) {
                    return name;
                }
                return nickname;
            } else {
                return name;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "unknown";
        }
...