用户实际上可以在很多地方保存联系人,而不仅仅是 3 个,例如如果用户安装了Yahoo 应用程序,他们也可以开始在Yahoo 上存储联系人,Outlook 也是如此,等等。
ContactsContract 涵盖所有这些选项,并提供单一 API 来查询存储在设备上的所有联系人。
不同的存储类型由ACCOUNT_NAME 和ACCOUNT_TYPE 在RawContact 级别区分。
您从查询中获得的Contact 结果实际上是来自一个或多个来源或ACCOUNT_TYPEs 的多个RawContacts 的聚合,因此请在您的SIM 和手机上复制RawContacts 应该聚合成一个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();