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

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

Поэтому я создаю свой 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изменить базу контактов, My onChange() не вызывается.

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 deliverySelfNotifications(). (по умолчанию возвращает false)

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

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

Убедитесь, что People.CONTENT_URI ссылается на правильное значение (android.provider.Contacts.People).

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

Простой СОВЕТ об ответе MannyNS.

Вот, People.CONTENT_URI устарела.

Вместо этого используйте следующий код.-->ContactsContract.Contacts.CONTENT_URI

    getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentobserver);
Другие вопросы по тегам