Подтвердить что ты не робот

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

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

Итак, я создаю свой 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() не вызывается.

4b9b3361

Ответ 1

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

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);
        MyContentObserver contentObserver = new MyContentObserver();
        getApplicationContext().getContentResolver().registerContentObserver(
            ContactsContract.Contacts.CONTENT_URI, 
            true, 
            contentObserver);
    }

    private class MyContentObserver extends ContentObserver {
        public MyContentObserver() {
            super(null);
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            Log.d(this.class.getSimpleName(), "A change has happened");
        }
    }
}

Что-то еще должно быть не так...

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

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

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

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

Ответ 2

ОБНОВЛЕНИЕ: Ответ MannyNS был обновлен с новым URI (ContactsContract.Contacts.CONTENT_URI)

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

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

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

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