【问题标题】:Syncing contacts using SyncAdapter ,Working使用 SyncAdapter 同步联系人,工作
【发布时间】:2016-06-20 14:34:02
【问题描述】:

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

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

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

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

  1. 如何判断同步是否失败?还是完成了?

【问题讨论】:

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


    【解决方案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 是唯一一个判断它是否成功的人。一般来说,如果在同步期间没有抛出异常,您可能可以认为它成功了。

    【讨论】:

    • 如果我手动尝试从联系人应用程序编辑/更新联系人,我注意到我只能编辑默认空调和其他链接的原始联系人中的原始联系人(指向相同的联系人._ID) 不可编辑。所以我的问题是当用户手动更新任何 rawcontact(默认帐户)时,它的 DIRTY 标志将设置为“1”。它还会设置其他链接的 rawcontacts 的 DIRTY 标志,以便我可以更新它们并将它们与服务器同步吗?
    • 脏标志由每个 rawcontact 处理。只有实际修改的 rawcontact 才会变脏。您的同步应用程序不应查看其他帐户的原始联系人。如果无法编辑原始联系人,则可能有问题。该帐户被认为是只读的,或者联系人应用程序已损坏。
    • ^对不起,我想我之前的评论不够清楚。我的意思是,我想检测用户何时从设备的本机联系人编辑屏幕手动编辑与我的应用程序的 ACCOUNT_TYPE 关联的 rawcontacts。据我所知,只有默认的 rawcontacts(google 或 device-local)可以从本机联系人屏幕编辑,而 rawcontacts(如 whatsapp、skype)是不可编辑的。它们仅以读取模式显示。(如果您认为链接的联系人也可以从本机联系人应用程序编辑,请告诉我)。因此,在这种情况下,永远不会设置链接的 rawcontacts 的 DIRTY 标志。
    • 在浏览 Android 示例代码时 - (SampleSyncAdapter) 我发现了以下代码,这进一步让我感到困惑。以下 rawcontacts 是如何在本地变脏的? // 找到我们需要告诉服务器的本地“脏”联系人。 // 查找需要同步到服务器的本地用户。 dirtyContacts = ContactManager.getDirtyContacts(mContext, account);我在这里错过了什么吗?
    • whatsapp 和 skype rawcontacts 无法编辑,因为这些应用程序已将其帐户类型设置为 只读。这实际上仅取决于同步应用程序。完全有可能创建一个创建可编辑 rawcontacts 的同步应用程序。 whatsapp 和 skype 只是不需要,因为您无法修改朋友的电话号码。
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 2016-09-17
    • 2019-05-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多