Pregunta

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.

¿Fue útil?

Solución

He implementado 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();

}

Por lo tanto, debes estar haciendo otra cosa mal.

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

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

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

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

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

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

Otros consejos

Un simple TIP sobre la respuesta de MannyNS.

Aquí, People.CONTENT_URI está en desuso.

Codifique como se indica a continuación .-- > ContactsContract.Contacts.CONTENT_URI

    getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentobserver);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top