Contactos ContentObserver llamado aleatoriamente
Estoy utilizando un ContentObserver para escuchar los cambios en la base de datos de contactos. Ahora me di cuenta de que el método onChange () se llama aleatoriamente, incluso si no he hecho ningún cambio en los contactos. Sospecho que esto está de alguna manera relacionado con la sincronización automática de contactos (aunque no haya cambios reales en los contactos en este momento).
¿Existe la posibilidad de ser notificado sólo si hay cambios reales en los contactos, realizados por el usuario?
- Sms ContentObserver onChange () se activa varias veces
- ContentObserver debe llamar si y sólo si ContactsContract.Contacts.CONTENT_URI cambia
- FIleObserver y ContentObserver no funcionan en Android Marshmallow
- ContentObserver se llama incluso cuando no hay cambios en el cursor
- Cuando se llama a ContentResolver.notifyChange () para un URI determinado, ContentObservers observa los URI descendientes de este URI notificados?
Thx simon
public class ContactsObserver extends ContentObserver { private final static String TAG = ContactsObserver.class.getSimpleName(); private Context ctx; private List<ContactsChangeListener> listeners = new ArrayList<ContactsChangeListener>(); private ContactsObserver(Context ctx) { super(new Handler()); this.ctx = ctx.getApplicationContext(); ctx.getContentResolver() .registerContentObserver( ContactsContract.Contacts.CONTENT_URI, // uri false, // notifyForDescendents this); // observer } @Override public void onChange(boolean selfChange) { Log.i(TAG, "Contacs change"); for(ContactsChangeListener l : listeners){ l.onContactsChange(); } } @Override public boolean deliverSelfNotifications() { return false; // set to true does not change anything... } public static ContactsObserver register(Context ctx){ Log.d(TAG, "register"); return new ContactsObserver(ctx); } public void unregister(){ Log.d(TAG, "unregister"); ctx.getContentResolver().unregisterContentObserver(this); } public void addContactsChangeListener(ContactsChangeListener l){ listeners.add(l); } public interface ContactsChangeListener{ void onContactsChange(); } }
- Cómo escuchar el contacto insertado / actualizado / eliminado en la libreta de direcciones
- Cómo el observador de contenido trabaja en archivos eliminados?
- Cómo implementar un ContentObserver en un fragmento utilizando CursorAdapter y LoaderCallbacks?
- Cómo manejar llamadas REST, persistencia de datos, sincronización y observación de ContentProvider
- Bloquear SMS salientes por contentObserver
- ContentObserver para los cambios de contacto de escucha
- El observador SMS enviado se ejecuta 3 veces
- Android - Observer DB cambia con GreenDao ORM
Ok, ya que nadie parece tener una respuesta a esta pregunta, aquí es lo que he hecho:
Al crear el observador, carga todos los contactos en una caché. Entonces, en cada evento onChange (), carga los contactos nuevamente y los comparo con los en caché para ver si hay una diferencia o no.
No la solución más elegante, pero funciona al menos …