как прослушивать изменения в базе данных контактов


Я пытаюсь прослушать любые изменения в базе данных контактов.

поэтому я создаю свой contentObserver, который является дочерним классом 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);

но когда я использовать 'EditContactActivity ' чтобы изменить базу данных контактов, мой onChange() не вызывали.

2 52

2 ответа:

я развернул ваш пример как есть, и он отлично работает.

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

}

Итак, вы, должно быть, делаете что-то еще не так.

вы вносите изменения через курсор, с которым зарегистрирован наблюдатель?

проверьте это с помощью функции Observer deliverSelfNotifications (). (он возвращает false по умолчанию)

вы можете переопределить эту функцию наблюдателя с чем-то вроде:

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

убедитесь, что люди.CONTENT_URI-это ссылаясь на правильное значение (андроид.поставщик.Контакты.Люди.)

кроме того, я бы предложил вам использовать обработчик с ContentObserver, хотя это не то, что делает ваш код неправильным в этом случае.

простой совет об ответе Мэннинов.

здесь People.CONTENT_URI устарела.

код следующим образом.-- > ContactsContract.Contacts.CONTENT_URI

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