как прослушать изменения в базе данных контактов
-
05-07-2019 - |
Вопрос
Я пытаюсь выслушать любые изменения в базе данных контактов.
Поэтому я создаю свой 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 ()
не вызывается.
Решение
Я развернул ваш пример как есть, и он отлично работает.
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);