получение никнейма контакта, часть 2

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

Однако теперь у меня есть:

final Cursor phoneCursor = context.getContentResolver().query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode("'" + incomingNumber + "'")), null, null, null, null);
phoneCursor.moveToFirst();

String lookupString = phoneCursor.getString(phoneCursor.getColumnIndex(PhoneLookup.LOOKUP_KEY));

final Cursor dataCursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.LOOKUP_KEY + "=" + "'" + lookupString + "'", null, null);
dataCursor.moveToFirst();

Log.e("smn", "display_name: " + dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
Log.e("smn", "nickname: " + dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DATA1)));

Результат выглядит так:

08-14 17:41:02.106: ERROR/smn(20146): display_name: Tom Tasche
08-14 17:41:02.106: ERROR/smn(20146): nickname: null

Этот ответ сказал мне, что псевдонимы хранятся в таблице данных, но хотя я запрашивая таблицу данных, я не получаю псевдоним контакта, сохраненный в моей адресной книге.

контакт с псевдонимом

Я уже пробовал по-другому: вставил новый псевдоним для этого контакта. И это сработало. Итак, ники вроде работают. Вдобавок я распечатал все поля, сохраненные в таблице данных, опять же, безуспешно.

Любые идеи? Может я что-то совершенно не так делаю, но пока не вижу в чем проблема ...

Спасибо за вашу помощь

Том


person TomTasche    schedule 14.08.2010    source источник
comment
Ваш телефон работает с Sense UI?   -  person Pentium10    schedule 14.08.2010


Ответы (1)


Я нашел "обходной путь":

Uri uri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookup);
InputStream stream = settings.context.getContentResolver().openInputStream(uri);

int length = stream.available();
if (length <= 0) {
    return;
}

byte[] vcard = new byte[length];
int bytesRead = stream.read(vcard, 0, length);
if (bytesRead < length) {
    return;
}

String vcardString = new String(vcard, 0, bytesRead, "UTF-8");

String SPLIT = "X-ANDROID-CUSTOM:vnd.android.cursor.item/nickname;";
if (vcardString.contains(SPLIT)) {
    vcardString = vcardString.substring(vcardString.indexOf(SPLIT) + SPLIT.length());
    vcardString = vcardString.substring(0, vcardString.indexOf(';'));

    name = vcardString;
}

Это действительно глупо, но работает и не так уж и медленно (~ 300 миллисекунд).

Удачи

Том

person TomTasche    schedule 06.09.2010