我正在使用ContactContracts API来获取RawContacts表中的条目
private void fetchRawContactEntries() {
String [] mProjectionColumns = new String [] {
RawContacts.CONTACT_ID,RawContacts.ACCOUNT_NAME,RawContacts.ACCOUNT_TYPE,RawContacts.DISPLAY_NAME_PRIMARY
};
Cursor c = getContentResolver().query(RawContacts.CONTENT_URI,mProjectionColumns,null,RawContacts.DISPLAY_NAME_PRIMARY + " ASC");
if(c != null) {
while(c.moveToNext()) {
long contactId = c.getLong(0);
String accountName = c.getString(1);
String accountType = c.getString(2);
String displayName = c.getString(3);
Log.d("Logs",contactId + ",accountName:" + accountName + ",Display Name : " + displayName);
}
}
}
我观察到每个联系人在raw_contacts表中都有多个条目. (Gmail,Duo等)
2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227,accountName:kartikayemail@gmail.com,Display Name : Abhay Y 2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227,accountName:WhatsApp,accountName:Duo,Display Name : Abhay Y 2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140,accountName:kartik@gmail.com,Display Name : Abhayuday 2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140,Display Name : Abhayuday 2019-05-28 19:21:15.484 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140,Display Name : Abhayuday
Infact Duo在RawContact表中输入两个不同的条目.本机联系人应用程序如何区分这些条目.
我知道他们会显示联系人表的条目,但是在修改raw_contact_id的数据时,他们会从Duo或Whatsapp或gmail中选择.
他们从哪里获得这些原始的raw_contact_id?
这是我已经知道的事情:
>重复条目的联系人ID相同,无论联系人提供者处理的来源如何.选中此一项ContactsAggregator
>联系人表具有一列name_raw_contact_id,该列提供RawContacts表的相应_ID(但是我不确定是否可以将其视为RawContacts表中联系人的主要条目).
下面是我想知道的事情清单:
>我们可以从ContactsContract.Contact表中获得唯一的联系人,但是为了使用联系人提供程序修改/删除数据值(例如电话,电子邮件等),我们可以选择哪个raw_contact_id?或者我可以直接在ContactContract.Data表中进行修改.
> whatsapp如何检测联系人的添加/修改.据我所知,Contact Provider没有为新的联系人添加提供_ID.他们是否在每次启动应用程序后或以相等的时间间隔刷新联系人列表?
>如何获取联系人的原始来源(在我的情况下,可能是gmail / native),并使用联系人提供程序忽略由Duo,skype,whatsapp之类的应用创建的副本.
如果有人帮助我理解这一点将是非常不错的.随意推荐我可以问这些问题的任何其他渠道
联系人数据库分为三个主要表:
>联系人-每个条目代表一个联系人,并将一个或多个RawContacts分组在一起
> RawContacts-每个条目代表与某个SyncAdapter(例如Whatsapp,Google,Facebook,Viber)同步的联系人有关的数据,该数据将多个Data条目分组
>数据-有关联系人,电子邮件,电话等的实际数据.每行是属于单个RawContact的单个数据
Google Play上具有足够权限的每个应用都可以添加新的联系人或新的RawContact并将其聚合到现有联系人中,就像Whatsapp / Duo一样,这允许每个应用存储有关特定联系人的信息,例如Whatsapp ID或任何其他对应用程序有用的信息.
您有一个错误的假设,即只有一个“主” RawContact是重要的,而其他的已附加.
相反,代表单个联系人的RawContacts列表可以包含多个具有同等重要性的Google RawContacts,或者根本不包含任何Google RawContacts,有一个区别可以帮助您选择要编辑的RawContacts,即是否由该应用程序为只读或可写.
以下代码可迭代设备上的所有帐户,并查看哪些是只读的,哪些是可修改的(supportsUploading):
final SyncAdapterType[] syncs = ContentResolver.getSyncAdapterTypes();
for (SyncAdapterType sync : syncs) {
Log.d(TAG,"found SyncAdapter: " + sync.accountType);
if (ContactsContract.AUTHORITY.equals(sync.authority)) {
Log.d(TAG,"found SyncAdapter that supports contacts: " + sync.accountType);
if (sync.supportsUploading()) {
Log.d(TAG,"found SyncAdapter that supports contacts and is not read-only: " + sync.accountType);
// we'll now get a list of all accounts under that accountType:
Account[] accounts = AccountManager.get(this).getAccountsByType(sync.accountType);
for (Account account : accounts) {
Log.d(TAG,account.type + " / " + account.name);
}
}
}
}
探索SyncAdapterType
中的其他好东西,例如isUserVisible,您也可能会帮助您.