使用 SyncAdapter 同步联系人,工作
Syncing contacts using SyncAdapter ,Working
我目前正在做一个 android 项目,我想在其中将手机联系人同步到服务器,在研究了很多关于 SyncAdapter
并在 accountmanager
中创建帐户之后,我有自己学的。但是有两件事我不明白,我在 google 中搜索了这些但无法得到完美的答案。请不要重复这个问题,我想更清楚地知道它是如何工作的。
- 正如 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
,不知道这对找到更改的内容有何帮助。上述方法是正确的实施方法吗?
- 如何发现同步失败?或已完成?
在没有 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 是唯一判断同步是否成功的代码。一般来说,如果在同步期间没有抛出异常,您可能会认为它成功了。
我目前正在做一个 android 项目,我想在其中将手机联系人同步到服务器,在研究了很多关于 SyncAdapter
并在 accountmanager
中创建帐户之后,我有自己学的。但是有两件事我不明白,我在 google 中搜索了这些但无法得到完美的答案。请不要重复这个问题,我想更清楚地知道它是如何工作的。
- 正如 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
,不知道这对找到更改的内容有何帮助。上述方法是正确的实施方法吗?
- 如何发现同步失败?或已完成?
在没有 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 是唯一判断同步是否成功的代码。一般来说,如果在同步期间没有抛出异常,您可能会认为它成功了。