查询指定群组的联系人成员?

发布于 2024-12-29 02:48:07 字数 92 浏览 5 评论 0原文

我需要获取 Android 联系人中特定组的成员。

我有联系人组名称及其 ID

任何人都可以告诉我如何查询特定组中成员的联系人提供程序吗?

I need to fetch the members for a specific group in android contacts.

I have the contact group names and their ID's

Can anyone provide me how to query the contacts provider for members in a particular group ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如果没有你 2025-01-05 02:48:07

尝试这个方法:

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。

在 Android 4+ 中拒绝将自定义字符串参数“GROUP BY”添加到 SQL 查询,因此我找到了此解决方法:

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;

Try this method:

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);
}

This works on Android 2.3.3 and lower, but doesn't work on Android 4+ and I don't currently know why.

UPD.

Adding custom string parameter "GROUP BY" to SQL query is denied in Android 4+, so I've founded this workaround:

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文