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_URIpublic void onChange(boolean selfChange)ContentObserver 类我正在调用 ContentResolver.requestSync(account,ContactsContract.AUTHORITY,bundle),它充当触发点以在联系人数据发生更改时启动同步适配器。

到这里为止一切看起来都很好,但是在 SyncAdapter 类中,我没有在 onPerofmSyncSyncResult 变量中获得任何数据

那么我如何从联系人中获取增量更改?

如果这不是触发同步适配器的方式,请纠正我。

方法二:

我遵循了一些示例,他们正在讨论查询联系人数据库,其中dirtyFlag 设置为 1。 我能够得到更改,但我的问题是

谁会将dirtyFlag 的值重新设置为“0”?

如果我必须这样做,那么可以说手机上有多个应用程序可以做同样的事情。如果某个应用程序在我的应用程序尝试访问信息之前将标志设置为“0”。我会错过所有的变化。

方法3:

查询数据库并为我自己的数据库中的每个联系人跟踪version,如果“版本”已更改,则将其视为联系人更改。这看起来是一个繁重的过程。

最后我的问题是什么是聆听变化的最佳方式 用户设备上的联系人?

【问题讨论】:

我来晚了,但第一种方法接近推荐的方法 => developer.android.com/training/sync-adapters/… 【参考方案1】:

您可以做的是保持(可能使用本地mysql 数据库)Contacts.LOOKUP_KEY 与其RawContacts.VERSION 值之间的映射。

一旦您收到Contacts DB 中发生更改的广播(通过onChange),您查询所有RawContacts.VERSIONs 及其Contacts.LOOKUP_KEY 并将其与您之前保持的状态进行比较,如果有的话其中一个变了,你就会知道联系人变了。

【讨论】:

是的,这是我的问题中的第三种方法。 是的,这就是我要做的,这不是一个繁重的过程,如果没有对所有联系人进行查询,我看不到任何方法。 因此,每当有“registerContentObserver(ContactsContract.Contacts.CONTENT_URI”调用的最小触发器时,我们应该对整个联系人进行查询,看看发生了什么变化与我们拥有什么? 您可以使用联系人表中的CONTACT_LAST_UPDATED_TIMESTAMP 来查询最近更改的联系人,请参阅:developer.android.com/reference/android/provider/…(注意此字段仅来自 API 18 及更高版本) @marmor 有趣,所以你的意思是我可以只查询我最近获得的时间戳值较高的联系人,这将只返回更新的联系人?你知道这可能有一个很好的样本吗?

以上是关于Android - 监听 android 联系人的变化并获取 deltas的主要内容,如果未能解决你的问题,请参考以下文章

Android来电监听

Android来电监听

Android来电监听

Android来电监听

Android-监听操作系统短信

Android 博客导航