gpt4 book ai didi

android - 为什么 Duo、whatsapp、skype 等应用程序在 native 联系人的 RawContact 表中具有条目

转载 作者:行者123 更新时间:2023-12-02 21:06:10 25 4
gpt4 key购买 nike

我正在使用 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, 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 Y2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227, accountName:WhatsApp, Display Name : Abhay Y2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227, accountName:Duo, Display Name : Abhay Y2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2227, accountName:Duo, Display Name : Abhay Y2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140, accountName:kartik@gmail.com, Display Name : Abhayuday2019-05-28 19:21:15.483 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140, accountName:WhatsApp, Display Name : Abhayuday2019-05-28 19:21:15.484 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140, accountName:Duo, Display Name : Abhayuday2019-05-28 19:21:15.484 5458-5458/com.example.kartikaysingh.cs D/Logs: 2140, accountName:Duo, Display Name : Abhayuday

事实上,Duo 在 RawContact 表中创建了两个不同的条目。 native contact 应用如何区分这些条目。
我知道他们显示联系人表的条目,但是当修改数据时,他们从Duo或Whatsapp或gmail中选择raw_contact_id。他们从哪里获得这些原始 raw_contact_id

以下是我已经知道的事情:

  1. 无论联系人提供商处理的来源如何,重复条目的联系人 ID 将相同。看看这个 ContactsAggregator
  2. 联系人表有一列name_raw_contact_id,它给出了RawContacts表的相应_ID(但是我不确定这是否可以被视为RawContacts表中联系人的主要条目)。<

下面列出了我想知道的事情:

  1. 我们可以从 ContactsContract.Contact 表中获取唯一的联系人,但为了使用联系人提供程序修改/删除数据值(如电话、电子邮件等),我们可以选择哪个 raw_contact_id ?或者我可以直接在 ContactContract.Data 表中修改吗?
  2. whatsapp 如何检测联系人的添加/修改。据我所知,联系人提供商不提供用于添加新联系人的_ID。他们是否在每次应用程序启动后或以相同的时间间隔刷新联系人列表?
  3. 如何获取联系人的原始来源(在我的例子中可能是 gmail/native),并忽略使用联系人提供商使用 Duo、Skype、whatsapp 等应用创建的副本。

如果有人能帮助我理解这一点,那就太好了。请随时推荐我可以询问这些问题的任何其他 channel

最佳答案

投影确实不正确。

联系人数据库由三个主要表组成:

  1. Contacts - 每个条目代表一个联系人,并将一个或多个联系人分组在一起 RawContacts
  2. RawContacts - 每个条目代表有关由某些 SyncAdapter 同步的联系人的数据(例如 Whatsapp、Google、Facebook、Viber),这会将多个数据条目分组
  3. Data - 有关联系人、电子邮件、电话等的实际数据。每一行都是属于单个RawContact的单个数据。

Google Play 上拥有足够权限的每个应用都可以添加新联系人或新 RawContact 并将其聚合到现有联系人中,就像 Whatsapp/Duo 一样,这允许每个应用存储有关特定联系人的信息,例如 Whatsapp ID ,或任何其他对该应用有用的信息。

您有一个错误的假设,即有一个“主要”RawContact 是重要的,其他的都附加到它。相反,代表单个联系人的 RawContacts 列表可以包含多个具有同等重要性的 Google RawContacts,或者根本不包含 Google RawContacts,有一个区别可以帮助您选择要编辑的 RawContact,即是否由该应用程序是只读或可写的。

以下代码用于迭代设备上的所有帐户,并查看哪些帐户是只读的、哪些是可修改的 ( 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这样你也可以帮助你。

关于android - 为什么 Duo、whatsapp、skype 等应用程序在 native 联系人的 RawContact 表中具有条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56343927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com