cómo escuchar los cambios en la base de datos de contactos

Estoy tratando de escuchar cualquier cambio en la base de datos de contactos.

Así que creo mi contentObserver que es una clase secundaria de ContentObserver :

  private class MyContentObserver extends ContentObserver { public MyContentObserver() { super(null); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); System.out.println (" Calling onChange" ); } } MyContentObserver contentObserver = new MyContentObserver(); context.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver); 

Pero cuando uso ‘ EditContactActivity ‘ para cambiar la base de datos de contactos, My onChange() no se llama.

Implementé tu ejemplo tal como está, y funciona bien.

 package com.test.contentobserver; import android.app.Activity; import android.database.ContentObserver; import android.os.Bundle; import android.provider.Contacts.People; public class TestContentObserver extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.getApplicationContext().getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver); } private class MyContentObserver extends ContentObserver { public MyContentObserver() { super(null); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); } } MyContentObserver contentObserver = new MyContentObserver(); } 

Entonces, debes estar haciendo otra cosa mal.

¿Estás haciendo los cambios a través del cursor con el que está registrado el observador?

Compruebe que con la función Observer deliverSelfNotifications (). (devuelve falso por defecto)

Es posible que desee anular esa función de observador con algo como:

 @Override public boolean deliverSelfNotifications() { return true; } 

Asegúrese de que People.CONTENT_URI se refiere al valor correcto (android.provider.Contacts.People).

Además, le sugiero que use Handler con ContentObserver, aunque eso no es lo que hace que su código sea incorrecto en este caso.

Un SUGERENCIA simple sobre la respuesta de MannyNS.

Aquí, People.CONTENT_URI está en desuso.

Codifique de la siguiente manera :–> ContactsContract.Contacts.CONTENT_URI

  getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentobserver);