如何检索每个可能的联系人?

时间:2018-08-19 15:22:45

标签: android android-contacts contactscontract

有多个示例说明了如何在android中检索联系人,最常见的类型是使用ContactsContract,如下所示:

ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.contacts.CONTENT_URI,null,null,null,null);

while(cursor.moveToNext){
//get contact details
.........

}

我的问题:

如果用户可以将他们的联系人保存在phoneSIMgoogle_account的三个位置。那么我如何使用一种方法来检索用户在电话中拥有的所有号码?

电话中的联系人列表也重复了联系人,我们又如何避免两次或4次或5次联系?

一次覆盖所有可能的联系人的方法是什么?

1 个答案:

答案 0 :(得分:1)

用户实际上可以在许多地方保存联系人,而不仅仅是3个地方。如果用户安装了Yahoo应用,他们也可以开始在Yahoo上存储联系人,Outlook也是如此,等等。

ContactsContract涵盖了所有这些选项,并提供了一个API来查询设备上存储的所有联系人。 在ACCOUNT_NAME级别上,不同的存储类型由ACCOUNT_TYPERawContact区分。

您从查询中获得的Contact结果实际上是来自一个或多个起源或RawContact的多个ACCOUNT_TYPE的集合,因此重复了RawContact SIM卡和电话上的 应该集成为一个Contact

这里有一些代码可以探索您设备上的自己的联系人(这是非常慢的代码,有些方法可以显着提高性能):

String[] projection = new String[] { Contacts._ID, Contacts.DISPLAY_NAME};
Cursor contacts = resolver.query(ContactsContract.Contacts.CONTENT_URI, projection, null, null, null);

while (contacts.moveToNext()) {

    long contactId = contacts.getLong(0);
    String name = contacts.getString(1);

    Log.i("Contacts", "Contact " + contactId + " " + name + " - has the following raw-contacts:");

    String[] projection2 = new String[] { RawContacts._ID, RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME };
    Cursor raws = resolver.query(RawContacts.CONTENT_URI, null, RawContacts.CONTACT_ID, null, null);

    while (raws.moveToNext()) {

        long rawId = raws.getLong(0);
        String accountType = raws.getString(1);
        String accountName = raws.getString(2);

        Log.i("Contacts", "\t RawContact " + rawId + " from " + accountType + " / " + accountName);
    }
    raws.close();
}
contacts.close();