Загрузить SMS-разговор вместе с именем контакта

Я разрабатываю приложение SMS и пришел к следующему вопросу. В настоящее время я могу читать SMS-разговор с помощью провайдера Telephony.Sms.Conversations с помощью CursorLoader. Из курсора, возвращаемого этим CursorLoader, я могу отображать адреса разговоров, которые являются телефонными номерами.

Мой вопрос заключается в том, как эффективно получить имя контакта SMS-разговора для отображения вместе с SMS-разговором, а не с номером телефона. Можно ли как-то загрузить список контактов из списка телефонных номеров, возвращенных CursorLoader ранее? Конечно, я пытался загружать одно за другим имя контакта, используя номер телефона, но это ужасно снижало производительность приложения.

Заранее спасибо.


person Duc Le    schedule 15.06.2015    source источник


Ответы (1)


Я сам искал решение и в итоге пришел к хорошему компромиссу, на мой взгляд.

Как только мой запрос завершен, я сохраняю в HashMap<String, String> contact_map свои значения как

int SENDER_ADDRESS = cursor.getColumnIndex(Telephony.TextBasedSmsColumns.ADDRESS);

while (cursor.moveToNext()) {
                contact_map.put(
                        cursor.getString(SENDER_ADDRESS),
                        getContactName(getApplicationContext(), cursor.getString(SENDER_ADDRESS))
                );
            }

Метод getContactName:

public static String getContactName(Context context, String phoneNumber) {
    ContentResolver cr = context.getContentResolver();
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
    if (cursor == null) {
        return null;
    }
    String contactName = null;
    if(cursor.moveToFirst()) {
        contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
    }

    if(cursor != null && !cursor.isClosed()) {
        cursor.close();
    }

    if (contactName != null) {
        return contactName;
    } else {
        return phoneNumber;
    }

}

РЕДАКТИРОВАТЬ: затем я получаю имя контакта с

String name = contact_map.get(cursor.getString(SENDER_ADDRESS));

Надеюсь, поможет!

person Matteo    schedule 25.07.2015