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

时间:2013-07-12 14:09:15

标签: android android-contacts android-syncadapter

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

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

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

  

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

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

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

正如官方文件所述:

  

某些同步适配器是只读的,这意味着它们只是同步   服务器端对手机的更改,但不是相反的。如果其中之一   原始联系人被标记为删除,它将保留在手机上。   然而,它将是有效的隐形,因为它不会成为其中的一部分   任何总联系人。

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

1 个答案:

答案 0 :(得分: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-party应用程序删除。