1

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

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

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

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

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

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

正如官方文档所述:

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

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

4

1 回答 1

1

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

使用RawContacts.EntityAPI 可以完成这项工作。

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

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 方应用程序删除。

于 2013-07-15T12:23:52.313 回答