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

时间:2015-01-17 23:58:41

标签: android android-contacts

我正在使用如下代码,并且在我的手机上它返回4000多行,但在我的手机上,我在联系人应用中有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();

2 个答案:

答案 0 :(得分:1)

解决方案是过滤具有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)和更新版本。

答案 1 :(得分:1)

我在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);

现在它按照联系人应用程序返回所有联系人。