Android - 监听 android 联系人的变化并获取 deltas
Posted
技术标签:
【中文标题】Android - 监听 android 联系人的变化并获取 deltas【英文标题】:Android - Listen to changes in android contacts and get the deltas 【发布时间】:2017-06-03 03:12:06 【问题描述】:我试图从过去几周了解同步适配器的整个概念,并且对功能有一些疑问。
我想听听android联系人的所有变化
方法一:
我创建了一个自定义帐户,还创建了一个同步适配器。
编写了一个广播监听器,收听ContactsContract.Contacts.CONTENT_URI
和
public void onChange(boolean selfChange)
的 ContentObserver
类我正在调用 ContentResolver.requestSync(account,ContactsContract.AUTHORITY,bundle)
,它充当触发点以在联系人数据发生更改时启动同步适配器。
到这里为止一切看起来都很好,但是在 SyncAdapter 类中,我没有在 onPerofmSync
的 SyncResult
变量中获得任何数据
那么我如何从联系人中获取增量更改?
如果这不是触发同步适配器的方式,请纠正我。
方法二:
我遵循了一些示例,他们正在讨论查询联系人数据库,其中dirtyFlag
设置为 1。
我能够得到更改,但我的问题是
谁会将
dirtyFlag
的值重新设置为“0”?
如果我必须这样做,那么可以说手机上有多个应用程序可以做同样的事情。如果某个应用程序在我的应用程序尝试访问信息之前将标志设置为“0”。我会错过所有的变化。
方法3:
查询数据库并为我自己的数据库中的每个联系人跟踪version
,如果“版本”已更改,则将其视为联系人更改。这看起来是一个繁重的过程。
最后我的问题是什么是聆听变化的最佳方式 用户设备上的联系人?
【问题讨论】:
我来晚了,但第一种方法接近推荐的方法 => developer.android.com/training/sync-adapters/… 【参考方案1】:您可以做的是保持(可能使用本地mysql
数据库)Contacts.LOOKUP_KEY 与其RawContacts.VERSION 值之间的映射。
一旦您收到Contacts
DB 中发生更改的广播(通过onChange
),您查询所有RawContacts.VERSION
s 及其Contacts.LOOKUP_KEY
并将其与您之前保持的状态进行比较,如果有的话其中一个变了,你就会知道联系人变了。
【讨论】:
是的,这是我的问题中的第三种方法。 是的,这就是我要做的,这不是一个繁重的过程,如果没有对所有联系人进行查询,我看不到任何方法。 因此,每当有“registerContentObserver(ContactsContract.Contacts.CONTENT_URI”调用的最小触发器时,我们应该对整个联系人进行查询,看看发生了什么变化与我们拥有什么? 您可以使用联系人表中的CONTACT_LAST_UPDATED_TIMESTAMP
来查询最近更改的联系人,请参阅:developer.android.com/reference/android/provider/…(注意此字段仅来自 API 18 及更高版本)
@marmor 有趣,所以你的意思是我可以只查询我最近获得的时间戳值较高的联系人,这将只返回更新的联系人?你知道这可能有一个很好的样本吗?以上是关于Android - 监听 android 联系人的变化并获取 deltas的主要内容,如果未能解决你的问题,请参考以下文章