android sync android-contacts contentobserver

android - Cómo escuchar contacto insertado/actualizado/eliminado en la libreta de direcciones



sync android-contacts (3)

De acuerdo con la respuesta de Magnus, use esta columna para recuperar el código de la versión

ContactsContract.RawContacts.VERSION

Hay muchas preguntas relacionadas con esto, pero ninguna me ayuda a encontrar la solución.

Estoy intentando sincronizar todos los contactos del dispositivo al servidor remoto y puedo hacerlo fácilmente, pero cuando hay un cambio en el contacto como actualizar / eliminar / insertar (nuevo contacto) no puedo encontrar la solución.

Se intentó usar ContentObserver pero onChange() se llama varias veces. Es difícil encontrar los datos de cambios de contacto.

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); } }

Pero se onChange() más de una vez cuando hay una actualización / inserción en la libreta de direcciones.

¿Alguien me puede dar una mejor solución?

Sería muy apreciado.

Gracias


Lo hice de esta manera y me funcionó para el registro de llamadas y el cambio de número de contacto.

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 } }


Lo que pasa con onChange es que se llama tanto para eliminar / agregar / actualizar, por lo que no puede simplemente contar la cantidad de contactos, ya que uno podría haber sido eliminado y uno agregado, entonces tiene una libreta de contactos modificada, pero la misma cantidad. Sin embargo, mirando la column la versión, debería poder evaluar qué contacto se actualiza o no (después de haber obtenido una copia completa del libro de contactos). Simplemente verifique si la versión es mayor que la que ya tiene (para el contacto actual).