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



有很多例子说明我们如何在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次联系?

必须使用什么方法来覆盖所有可能的联系人?

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

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

您从查询中获得的Contact结果实际上是来自一个或多个源或ACCOUNT_TYPE的多个RawContact的聚合,因此 SIM 和手机上的重复RawContact聚合为单个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();

相关内容

  • 没有找到相关文章

最新更新