Я должен был сделать что-то подобное. То, что я сделал, было синхронизировать на основе метки времени. Я отслеживаю последнее время, когда контакт был обновлен, используя поле:
ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP
А затем я продолжаю свою операцию синхронизации и каждый раз обновляю переменную-член до последнего времени синхронизации. Когда синхронизация завершена, у нее есть время последней синхронизации контакта.
Когда наблюдатели изменений что-то регистрируют, я запрашиваю контент-провайдер для всех строк, на которые повлияло это время. И затем я перебираю курсор и обрабатываю каждую строку.