There are lots of questions related to it but none of them help me to get the solution.
I am trying to sync all contacts from device to remote server and able to do it easily but when there is a change in contact like update/delete/insert(new contact) unable to find the solution.
Tried using ContentObserver
but onChange()
is getting called multiple times. It's difficult to find the contact changes data.
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);
}
}
But onChange()
getting called more than once when there is a update/insert into address book.
can anyone provide me better solution to it?
It would be highly appreciated.
Thanks
The thing about onChange
is that it gets called both for delete/add/update so you can't just count the number of contacts since one might have been deleted and one added then you have a changed contact book, but same count. However looking at the version column you should be able to assess which contact is updated or not (after you've obtained one complete copy of the contact book already). Simply check if the version is greater than the one you have already (for the current contact).
In accordance with Magnus' answer, use this column to retrieve the version code
ContactsContract.RawContacts.VERSION
i did in this way and it worked for me for call Log and 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
}
}
来源:https://stackoverflow.com/questions/21650621/how-to-listen-contact-inserted-updated-deleted-in-address-book