3

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

  1. 正如谷歌文档所说,只要同步完成,联系人的脏标志就会改变。我的疑问是,当我以编程方式指定哪些联系人进入服务器时,android 操作系统将如何检测该特定联系人的同步状态?

例如:- 在下面的示例中,我想将捆绑包发送到服务器。

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

然后在 Method 上接收到的 Bundle extrasonPerformSync并发送到服务器。

    @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 是在过滤联系人列表中的更改后获得的捆绑包,想要将它们更新到服务器。现在 SyncAdapter 框架或操作系统将如何检测更改并更新该联系人的脏标志?当然我已经提供了AUTHORITY,不知道这对发现发生了什么变化有什么帮助。上述方法是正确的实施方式吗?

  1. 如何判断同步是否失败?或完成?
4

1 回答 1

1

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

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

我相信您不能通过设置DELETED来“取消删除”联系人0,因为(根据我的经验)联系人数据已经被删除。只剩下 RawContact 条目(不过,也许我上次尝试时只有一个行为不端的设备)。

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

关于问题2:

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

于 2016-06-22T11:31:43.250 回答