Android: получить все контакты с помощью IM

#android #android-contentprovider #android-contacts #android-cursor

#Android #android-contentprovider #android-контакты #android-курсор

Вопрос:

Я хочу сделать запрос поставщику контента контактов таким образом, чтобы, если у контакта есть IM, тип которого равен «XYZ».

Я пробовал ниже, но не получаю никакого результата:

     Uri uri1 = ContactsContract.Contacts.CONTENT_URI;
    String[] projection1 = null;
    String selection1 = null;
    String[] selectionArgs1 = null;
    String sortOrder1 = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME   " ASC";
    Cursor cursor1 = context.getContentResolver().query(uri1, projection1, selection1, selectionArgs1, sortOrder1);
    if (cursor1 != null amp;amp; cursor1.getCount() > 0) {
        while (cursor1.moveToNext()) {
            int contactId = Integer.parseInt(cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts._ID)));

            Uri uri2 = ContactsContract.Data.CONTENT_URI;
            String[] projection2 = null;
            String selection2 = ContactsContract.CommonDataKinds.Im.PROTOCOL   " = ? AND "   ContactsContract.Contacts._ID   " = ? ";
            String[] selectionArgs2 = new String[]{"XYZ", contactId   ""};
            String sortOrder2 = null;
            Cursor cursor2 = context.getContentResolver().query(uri2, projection2, selection2, selectionArgs2, sortOrder2);
            if (cursor2 != null amp;amp; cursor2.getCount() > 0) {
                while (cursor2.moveToNext()) {
                    Log.i(TAG, "Name: "   cursor2.getString(cursor2.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));

                }
                DatabaseUtils.dumpCursor(cursor2);
            }
        }
        cursor1.close();
    }
  

Я не получаю никакого журнала с приведенным выше кодом.

PS: я не использую встроенные протоколы, такие как AIM, Windows Live, Yahoo или skype. Это мой пользовательский протокол, скажите это «XYZ».

Ответ №1:

Для этого вам нужно запросить ContactsContract.Data.CONTENT_URI and с типом mime как IM, а затем в поле label или type (не уверен) указывается, какой тип IM, как вы сказали «XYZ», и в столбце value вы получите значение, подобное имени пользователя.

В этой таблице есть внешний ключ, который связан с необработанным идентификатором контакта таблицы raw_contacts.

Обновить

 Cursor cursor = getActivity().getApplicationContext().getContentResolver().query(
                ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.MIMETYPE   "=?", new String[]{ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}, null);
        if(cursor!=null) {
            cursor.moveToFirst();
            do {
                String value = cursor
                        .getString(cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));

                //Types are defined in CommonDataKinds.Im.*
                int imppType = cursor
                        .getInt(cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));

                //Protocols are defined in CommonDataKinds.Im.*
                int imppProtocol = cursor
                        .getInt(cursor
                                .getColumnIndex(ContactsContract.CommonDataKinds.Im.PROTOCOL));
                //and in this protocol you can check your custom value
            }while (cursor.moveToNext());
            cursor.close();
        }
  

Спасибо

Комментарии:

1. Некоторый фрагмент был бы более полезным.

Ответ №2:

Я наткнулся на ту же проблему. Оказывается, что протокол должен быть an Int вместо a String . В случае, если вы являетесь пользовательским, вы должны использовать ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM псевдоним для -1 .