android - 如何检索每个可能的联系人?
问题描述
有多个示例说明我们如何在 android 中检索联系人,最常见的类型是ContactsContract
这样使用的:
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.contacts.CONTENT_URI,null,null,null,null);
while(cursor.moveToNext){
//get contact details
.........
}
我的问题:
如果用户可以将他们的联系人保存在三个地方phone
,,,SIM
。google_account
那么我如何能够使用一种方法来检索用户在电话上拥有的所有号码?
此外,由于手机中的联系人列表重复联系人,我们如何避免获得联系人两次或 4 次或 5 次?
必须使用什么方法来覆盖所有可能的联系人?
解决方案
用户实际上可以在很多地方保存联系人,而不仅仅是 3 个,例如,如果用户安装了该应用Yahoo
程序,他们也可以开始存储联系人,等等。Yahoo
Outlook
它ContactsContract
涵盖了所有这些选项,并提供了一个 API 来查询存储在设备上的所有联系人。不同的存储类型是按级别区分ACCOUNT_NAME
的。ACCOUNT_TYPE
RawContact
Contact
您从查询中获得的结果实际上是RawContact
来自一个或多个来源或 s 的多个 s的聚合,因此您的 SIM 和电话上的ACCOUNT_TYPE
重复s应该聚合成一个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();
推荐阅读
- javascript - 将项目对齐到整个父级的宽度减去边距
- sql - SQL:创建另一个计算比率的列
- reactjs - Material UI 安装失败,在节点版本 13.3.3
- javascript - 仅在悬停时显示视频播放按钮
- docker - GitHub Actions Docker 构建和推送无法复制:意外状态:413 请求实体太大
- javascript - for 循环仅显示数组对象中的一项和最后一项
- r - 基于多个条件创建新变量
- javascript - 如何使用点积找出旋转角度
- javascript - 如何在反应中嵌套条件语句 - 变得未定义
- google-visualization - 谷歌可视化 - 选择处理程序不起作用