Android原生联系人应用程序删除每个帐户联系人

Posted

技术标签:

【中文标题】Android原生联系人应用程序删除每个帐户联系人【英文标题】:Android native Contacts application deletes every account contacts 【发布时间】:2013-07-11 02:42:01 【问题描述】:

我的问题是我试图禁止原生 android 联系人应用程序从设备中删除我的应用程序的联系人(由我的应用程序帐户类型指定)。

为此,我用自己的Service 指定了我自己的SyncAdapter,它是syncadapter.xml 中描述的元数据。 supportsUploading 的值设置为 false(这样我说我的应用程序创建的联系人是只读的)

但是,当我尝试从标准联系人应用程序中删除我的应用程序的联系人时,我收到以下消息:

您无法从只读帐户中删除联系人,但可以隐藏 他们在您的联系人列表中

在我尝试从我自己的应用程序中的标准“联系人”中获取之前删除(“隐藏”)的联系人数据之前,一切似乎都很好。

返回的游标为空,因为Data 表中没有与此联系人的RAW_CONTACT_ID 关联的任何行。我还会检查联系人是否存在于正在查找的设备上 它是RawContacts表中的DELETED标志值,观察到它已被设置为1,这意味着该联系人已被删除。

如官方文档所述:

一些同步适配器是只读的,这意味着它们只同步 服务器端对手机的更改,但不是相反。如果其中之一 原始联系人被标记为删除,它将保留在手机上。 但是它实际上是不可见的,因为它不会是一部分 任何聚合联系人。

所以问题是我无法再在我的应用程序中显示此联系人的数据,因为我不知道如何从联系人数据库中检索它们。如果有人知道如何处理这种情况,我将不胜感激任何建议。谢谢

【问题讨论】:

【参考方案1】:

因此,经过更细致的搜索,我找到了在我的应用程序中检索任何 RAW_CONTACT 数据的方法,无论它是否从其他应用程序中删除。

使用RawContacts.Entity API 完成这项工作。

之前我尝试使用这样的逻辑来检索联系人的数据:

public Cursor getContactData(long rawContactId) 
    return getContentResolver().query(ContactsContract.Data.CONTENT_URI, null,
            ContactsContract.Data.RAW_CONTACT_ID + "=" + rawContactId, null);

而且这个方法总是返回null来删除联系人。

但是使用RawContacts.Entity这样的方式:

public Cursor getContactData(long rawContactId) 
    Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, id);
    rawContactUri = Uri.withAppendedPath(rawContactUri, RawContacts.Entity.CONTENT_DIRECTORY);

    return getResolver().query(rawContactUri, null, null, null);

允许在具有适当权限的应用程序中获取联系人的数据,无论它是否被 3d 方应用程序删除。

【讨论】:

我很惊讶这应该是真的。我很困惑它与the description on developer.android.com 冲突

以上是关于Android原生联系人应用程序删除每个帐户联系人的主要内容,如果未能解决你的问题,请参考以下文章

Android 内容解析器返回在移动设备中激活的所有帐户 否

Android 联系人 - android 联系人的所有帐户类型是啥?

如何将我的 Flutter App 联系人链接到 android 的原生联系人应用程序?

删除父帐户时如何防止联系子删除?

从联系人中删除自定义帐户 ACCOUNT_TYPE

如何从 Android 联系人中的联系人 ID 获取只读帐户名称