使用SyncAdapter,工作同步联系人

时间:2016-06-20 14:34:03

标签: android android-contentprovider android-syncadapter accountmanager android-authenticator

我目前正在开发一个Android项目,我希望将移动联系人同步到服务器,在研究了很多关于SyncAdapter和在accountmanager中创建帐户之后,我自己就学会了。然而,有两件事我不明白,我在谷歌搜索这些,但无法得到完美的答案。请不要复制这个问题,我想更清楚地知道它是如何工作的。

  1. 正如Google文档所述,无论何时完成同步,联系人的脏标志都会发生变化。我怀疑的是Android操作系统将如何检测该特定联系人的同步状态,因为我以编程方式指定哪些联系人进入服务器?
  2. Ex: - 在下面的示例中,我想将一个包发送到服务器。

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

    然后在onPerformSync方法上收到Bundle附加内容并发送到服务器。

        @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是在过滤联系人列表中的更改后获得的bundle,想要将它们更新到server.Now SyncAdapter框架或OS如何检测更改并更新脏那个联系人的旗帜?我当然提供AUTHORITY,但不知道这有助于找到改变的内容。以上方法是否正确实施?

    1. 如何查找同步是否失败?还是完成了?

1 个答案:

答案 0 :(得分:1)

在Uri上没有CALLER_IS_SYNC_ADAPTER的情况下对联系人进行的每次修改都会使ContentProvider将修改过的联系人的DIRTY标志设置为1。同样,没有该参数的每个删除请求都只会设置DELETED标志,而不是删除联系人。

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

我认为您不能通过将DELETED设置为0来“取消删除”联系人,因为(根据我的经验)此时联系人数据已被删除。只剩下RawContact条目(但是,当我最后一次尝试时,我可能只是一个行为不端的设备)。

指定CALLER_IS_SYNCADAPTER非常重要,否则不会发生任何事情(并且您的SyncAdapter注定会一次又一次尝试同步这些联系人。)

关于问题2:

这完全取决于您的SyncAdapter。您编写代码以同步联系人,并且您是SyncAdapter是唯一可以判断它是否成功的人。一般情况下,如果在同步过程中没有抛出异常,您可能会认为它成功了。