无法从 ContactsContract.Contacts.CONTENT_URI 获取已删除的联系人

Posted

技术标签:

【中文标题】无法从 ContactsContract.Contacts.CONTENT_URI 获取已删除的联系人【英文标题】:Unable to fetch deleted contacts from ContactsContract.Contacts.CONTENT_URI 【发布时间】:2021-09-04 19:04:36 【问题描述】:

我正在尝试从 android 联系人表中获取已删除的联系人。在搜索了一些 Stack Overflow 链接后,获取已删除联系人的最佳方法是使用 ContactsContract.DeletedContacts。我能够从 DeletedContacts 表中获取已删除的联系人。

val deletedContactsProjection = arrayOf(ContactsContract.DeletedContacts.CONTACT_ID,ContactsContract.DeletedContacts.CONTACT_DELETED_TIMESTAMP)
val contactLastDeletedTimeStamp = SharedPreferenceManager.instance.getLongFromPreference("contact_sync_last_updated_timestamp")
val deletedContactSelection = ContactsContract.DeletedContacts.CONTACT_DELETED_TIMESTAMP + " > ?";
val deletedContactSelectionArgs = arrayOf<String>(contactLastDeletedTimeStamp.toString())
var deletedContactsCursor = context.contentResolver.query(ContactsContract.DeletedContacts.CONTENT_URI, deletedContactsProjection,deletedContactSelection, deletedContactSelectionArgs,null)

使用上面的光标,我可以获取最后删除的联系人。当我从光标中检查已删除联系人的 ContactsContract.DeletedContacts.CONTACT_ID 时,它与我删除的联系人 ID 相同。但问题是当我尝试使用 ContactsContract.DeletedContacts.CONTACT_ID 从 ContactsContract.Contacts 表中获取联系人时,它总是返回 null。

这是我正在使用的查询:

String[] contactNumberProjection = ContactsContract.Contacts._ID;
String contactId = deletedContactsCursor.getString(deletedContactsCursor.getColumnIndex(ContactsContract.DeletedContacts.CONTACT_ID));
String contactSelection = ContactsContract.Contacts._ID + " = ?";
String[] contactSelectionArg = contactId;
Cursor contactCursor =
context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,contactNumberProjection,contactSelection,contactSelectionArg,null);

我哪里错了?

【问题讨论】:

【参考方案1】:

当一个联系人从Contacts 主表中删除时,它显然会从该表中删除,因此该联系人不会出现在用户所在的联系人应用程序中使用查看他们当前的联系人。

因此您只能在DeletedContacts 表中获取已删除联系人的详细信息。

【讨论】:

那么如何获取已删除联系人的手机号码和用户名等详细信息,我应该更改查询吗?因为deletedcontacts表除了contact id和contact deleted time之外不包含任何细节。 你不能......它对同步联系人的应用程序更有用,这会让他们知道联系人 X 最近被删除并且他们应该同步删除。 是的,我也需要同步我的联系人,但我没有使用同步适配器来同步联系人。因此,我可能需要循环联系人并检查已删除的联系人。如果我能够联系手机号码,然后我可以查询该号码并将其从我的应用程序数据库中删除。 然后将联系人 ID 存储在本地数据库中,并使用它来找出最近删除的联系人。切勿使用电话号码或电子邮件作为唯一联系人的键!多个联系人可能共用同一个电话和/或电子邮件,您可能删除了错误的联系人

以上是关于无法从 ContactsContract.Contacts.CONTENT_URI 获取已删除的联系人的主要内容,如果未能解决你的问题,请参考以下文章

获取与 facebook for android 同步的联系人照片

无法从临时表中删除?

Flutter:无法从存储中读取密钥:无法恢复密钥

无法从资源加载位图

为啥我无法从 Alamofire 获取请求结果

DateTimeParseException:无法解析文本:无法从 TemporalAccessor 获取 LocalDateTime