Запрос Связаться с участниками из указанной группы? - PullRequest
0 голосов
/ 26 января 2012

Мне нужно выбрать членов для определенной группы в контактах Android.

У меня есть имена групп контактов и их идентификаторы

Может ли кто-нибудь предоставить мне, как запросить у поставщика контактов участников в определенной группе?

1 Ответ

4 голосов
/ 04 октября 2012

Попробуйте этот метод:

private Cursor getContacts(String groupID) {
   Uri uri = ContactsContract.Data.CONTENT_URI;

   String[] projection = new String[] {
       ContactsContract.Contacts._ID,
       ContactsContract.Data.CONTACT_ID,
       ContactsContract.Data.DISPLAY_NAME
   };

   String selection = null;
   String[] selectionArgs = null;

   if(groupID != null && !"".equals(groupID)) {
       selection = ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID
                   + " = ?";
       selectionArgs = new String[] { groupID };
   }
   else
       selection = "1) GROUP BY (" + ContactsContract.Data.CONTACT_ID;

       String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
                          + " COLLATE LOCALIZED ASC ";

       return getContentResolver().query(uri, projection, 
                                         selection, selectionArgs, sortOrder);
}

Это работает на Android 2.3.3 и ниже, но не работает на Android 4+, и в настоящее время я не знаю почему.

UPD.

Добавление пользовательского строкового параметра «GROUP BY» в запрос SQL запрещено в Android 4+, поэтому я нашел этот обходной путь:

private Cursor getContacts(String groupID) {
    Uri uri = ContactsContract.Data.CONTENT_URI;

    String[] projection = new String[] {
            ContactsContract.Contacts._ID,
            ContactsContract.Data.CONTACT_ID,
            ContactsContract.Data.DISPLAY_NAME
    };

    String selection = null;
    String[] selectionArgs = null;

    if(groupID != null && !"".equals(groupID)) {
        selection = ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID 
                        + " = ?";
        selectionArgs = new String[] { groupID };
    }

    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
                        + " COLLATE LOCALIZED ASC ";

    Cursor cursor = getContentResolver().query(uri, projection, 
                                          selection, selectionArgs, sortOrder); 

    MatrixCursor result = new MatrixCursor(projection);
    Set<Long> seen = new HashSet<Long>();
    while (cursor.moveToNext()) {
        long raw = cursor.getLong(1);
        if (!seen.contains(raw)) {
            seen.add(raw);
            result.addRow(new Object[] { cursor.getLong(0), 
                             cursor.getLong(1), cursor.getString(2) });
        }
    }

    return result;
...