#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
.