使用 SyncAdapter 同步联系人,工作

Syncing contacts using SyncAdapter ,Working

我目前正在做一个 android 项目,我想在其中将手机联系人同步到服务器,在研究了很多关于 SyncAdapter 并在 accountmanager 中创建帐户之后,我有自己学的。但是有两件事我不明白,我在 google 中搜索了这些但无法得到完美的答案。请不要重复这个问题,我想更清楚地知道它是如何工作的。

  1. 正如 Google 文档所说,只要同步完成,联系人的脏标志就会更改。我怀疑 android OS 将如何检测该特定联系人的同步状态,因为我以编程方式指定哪些联系人进入服务器?

Ex:- 在下面的示例中,我想将一个包发送到服务器。

    Bundle extras = new Bundle();
      extras.putInt("contact name after filtering", "number after filtering");  
      ContentResolver.requestSync(account,ContactsContract.AUTHORITY, extras);

然后在 onPerformSync 方法上收到 Bundle extras 并发送到服务器。

    @Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {

    for (String key : extras.keySet())
    {
        Log.d("Bundle Debug", key + " = \"" + extras.get(key) + "\"");
    }

       //Code to send to server

}

假设在上面的例子中,变量 extras 是一个包,它是在过滤联系人列表中的更改后获得的,想要将它们更新为 server.Now SyncAdapter 框架或 OS 如何检测到更改并更新该联系人的脏标志?当然,我提供了 AUTHORITY,不知道这对找到更改的内容有何帮助。上述方法是正确的实施方法吗?

  1. 如何发现同步失败?或已完成?

在没有 CALLER_IS_SYNC_ADAPTER on the Uri will make the ContentProvider set the DIRTY flag of the modified contact to 1. Similarly, every delete request without that parameter will just set the DELETED 标志而不是删除联系人的情况下对联系人进行的每次修改。

您的 SyncAdapter 必须查询标记为脏的联系人或 DELETED,采取适当的操作(将新的联系人数据发送到服务器或从服务器中删除联系人)并清除脏标记(通过使用具有 CALLER_IS_SYNCADAPTER 参数的 0 覆盖它)或通过再次删除联系人(再次具有 CALLER_IS_SYNCADAPTER 参数)来完成删除。

我相信您无法通过将 DELETED 设置为 0 来 "undelete" 联系人,因为(根据我的经验)联系人数据已在此时删除。只剩下 RawContact 条目(不过,也许我上次尝试时只是一个行为不端的设备)。

指定 CALLER_IS_SYNCADAPTER 很重要,否则什么也不会发生(并且您的 SyncAdapter 注定要一次又一次地尝试同步这些联系人)。

关于问题 2:

这完全取决于您的 SyncAdapter。您编写代码来同步联系人,而您是 SyncAdapter 是唯一判断同步是否成功的代码。一般来说,如果在同步期间没有抛出异常,您可能会认为它成功了。