Синхронизация контактов с использованием SyncAdapter,Working
В настоящее время я работаю над проектом Android, в котором я хочу синхронизировать мобильные контакты с сервером, после много исследований о SyncAdapter
и создание аккаунта в accountmanager
Я узнал это сам. Однако есть две вещи, которые я не понимаю, я искал об этом в Google, но не смог получить идеальный ответ. Пожалуйста, не дублируйте вопрос, я хочу более четко знать, как он работает.
- Как говорится в документации Google, когда выполняется синхронизация, флаг грязного контакта меняется. Я сомневаюсь, как ОС Android будет определять состояние синхронизации этого конкретного контакта, так как я программно указываю, какие контакты отправляются на сервер?
Пример:- В приведенном ниже примере я хочу отправить пакет на сервер.
Bundle extras = new Bundle();
extras.putInt("contact name after filtering", "number after filtering");
ContentResolver.requestSync(account,ContactsContract.AUTHORITY, extras);
затем дополнения Bundle, полученные на onPerformSync
Способ и отправить на сервер.
@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 ответ
Каждая модификация контакта, которая выполняется без CALLER_IS_SYNC_ADAPTER
на Uri заставит ContentProvider установить DIRTY
флаг измененного контакта с 1
, Точно так же каждый запрос на удаление без этого параметра просто устанавливает DELETED
пометить вместо удаления контакта.
Ваш SyncAdapter должен запросить контакты, помеченные как грязные или DELETED
выполните соответствующее действие (отправьте новые контактные данные на сервер или удалите контакты с сервера) и снимите флажок "грязный" (переопределив его с помощью 0
имея CALLER_IS_SYNCADAPTER
параметр на месте) или завершите удаление, удалив контакт снова (снова имея CALLER_IS_SYNCADAPTER
параметр на месте).
Я считаю, что вы не можете "восстановить" контакт, установив DELETED
в 0
, поскольку (по моему опыту) контактные данные уже были удалены в этот момент. Осталась только запись RawContact (хотя, может быть, у меня было просто плохо работающее устройство, когда я попробовал это в прошлый раз).
Важно указать CALLER_IS_SYNCADAPTER
иначе ничего не произойдет (и ваш SyncAdapter обречен на попытку синхронизировать эти контакты снова и снова).
По вопросу 2:
Это полностью зависит от вашего SyncAdapter. Вы пишете код для синхронизации контактов, а SyncAdapter - единственный, кто сообщает, успешно это или нет. В целом вы, вероятно, можете предположить, что это удалось, если во время синхронизации не было сгенерировано никаких исключений.