如何在地址簿中收听插入/更新/删除的联系人

有很多与之相关的问题,但没有一个能帮助我find解决方案。

我正在尝试将所有联系人从设备同步到远程服务器并且能够轻松地执行此操作但是当更新/删除/插入(新联系人)等联系人发生更改时无法find解决方案。

尝试使用ContentObserveronChange()被多次调用。 很难find联系人更改数据。

  public class ContactService extends Service { private int mContactCount; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { super.onCreate(); mContactCount = getContactCount(); Log.d("Contact Service", mContactCount + ""); this.getContentResolver().registerContentObserver( ContactsContract.Contacts.CONTENT_URI, true, mObserver); } private int getContactCount() { Cursor cursor = null; try { cursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cursor != null) { return cursor.getCount(); } else { return 0; } } catch (Exception ignore) { } finally { if (cursor != null) { cursor.close(); } } return 0; } private ContentObserver mObserver = new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); final int currentCount = getContactCount(); if (currentCount < mContactCount) { // CONTACT DELETED. Log.d("Contact Service", currentCount + ""); } else if (currentCount == mContactCount) { // CONTACT UPDATED. og.d("Contact Service", currentCount+""); } else { // NEW CONTACT. Log.d("Contact Service", currentCount + ""); } mContactCount = currentCount; } }; @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); getContentResolver().unregisterContentObserver(mObserver); } } 

但是当地址簿中有更新/插入时, onChange()不止一次被调用。

任何人都能为我提供更好的解决方案吗?

非常感谢。

谢谢

关于onChange的事情是,它既被删除/添加/更新也被调用,所以你不能只计算联系人的数量,因为一个人可能已被删除,一个被添加,然后你有一个更改的联系簿,但相同的计数。 但是,查看版本列,您应该能够评估哪个联系人已更新(在您已经获得联系簿的完整副本之后)。 只需检查版本是否大于您已经拥有的版本(对于当前联系人)。

根据Magnus的回答,使用此列检索版本代码

ContactsContract.RawContacts.VERSION

我这样做了,它为我调用Log和ContactNumber Change。

 in onChange execute a Query with contentResolver(), and put the data in a List then something is deleted again execute a Query with contentResolver(), and assign it to tempList. now compare the List and tempList @Override public void onChange(boolean selfChange) { super.onChange(selfChange); final int List = totalContacts(); if (tempList < List) { something is deleted then remove the tempList from List you will get the deleted number }else if (tempList == List) { something is updated then remove the tempList from List you will get the deleted number }else { something is added(reverse the Lists) then remove the List from tempList you will get the deleted number } }