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

Hay un montón de preguntas relacionadas con él, pero ninguno de ellos me ayudan a obtener la solución.

Estoy intentando sincronizar todos los contactos del dispositivo al servidor alejado y capaz de hacerlo fácilmente pero cuando hay un cambio en el contacto como la actualización / la cancelación / la inserción (nuevo contacto) incapaz de encontrar la solución.

Intentó usar ContentObserver pero onChange() se está llamando varias veces. Es difícil encontrar los datos de los 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 onChange() se llama más de una vez cuando hay una actualización / insertar en la libreta de direcciones.

¿Alguien puede proporcionarme una mejor solución?

Sería muy apreciado.

Gracias

La cosa sobre onChange es que se llama tanto para eliminar / añadir / actualizar por lo que no puede contar el número de contactos ya que uno podría haber sido eliminado y uno añadido, a continuación, tiene un libro de contactos cambiado, pero la misma cuenta. Sin embargo, al mirar la columna de la versión, deberías poder evaluar qué contacto se actualiza o no (después de haber obtenido una copia completa del libro de contactos). Simplemente compruebe si la versión es mayor que la que ya tiene (para el contacto actual).

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

ContactosContract.RawContacts.VERSION

Hice de esta manera y trabajó para mí para el registro de la llamada y el cambio de ContactNumber.

 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 } } 
  • Lista de autorizaciones admitidas para cuentas seleccionadas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.