Android 检索一组类似于内置联系人应用程序的联系人

Android retrieve a set of contacts similar to built in Contacts app

我正在使用如下代码,在我的 phone 上它有 returns 4000 多行,但在我的 phone 上我的通讯录应用程序中有 295 个联系人。

这是怎么回事?我一直在阅读联系人数据库,但我还不够熟悉,无法弄清楚。

谢谢!

    final ContentResolver cr = getContentResolver();
    final Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

    List<Contact> contacts = new ArrayList<>();

    final int nameIdx = cur.getColumnIndex(DISPLAY_NAME);
    final int idIdx = cur.getColumnIndex(ContactsContract.Contacts._ID);

    while (cur.moveToNext()) {
      String name = cur.getString(nameIdx);
      String id = cur.getString(idIdx);
      contacts.add(new Contact(name, id));
    }
    cur.close();

解决方案是筛选 IN_VISIBLE_GROUP = 1 的联系人。

    final String selection = String.format("%s = ?", ContactsContract.Contacts.IN_VISIBLE_GROUP);
    final String[] selectionArgs = new String[] { "1" };
    final Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, selection, selectionArgs, null);

我也尝试了 IN_DEFAULT_DIRECTORY = 1,它也运行良好,但仅在 Lollipop (21) 和更新版本上受支持。

我在Android 6中遇到了类似的问题。当您使用

查询时,某些联系人没有显示出来
ContactsContract.Contacts.IN_VISIBLE_GROUP = 1 

然后我将选择更改为

String selection = "in_default_directory = 1"; // Aka ContactsContract.ContactsColumns.IN_DEFAULT_DIRECTORY
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
Cursor nameCursor = context.getContentResolver().query(uri, null, selection, selectionArgs, sortOrder);

现在 returns 所有联系人都按照联系人应用。