質問
連絡先データベースの変更をリッスンしようとしています。
だから、 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()
が呼び出されません。
解決
サンプルをそのままデプロイしましたが、正常に動作します。
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;
}
People.CONTENT_URIが正しい値(android.provider.Contacts.People)を参照していることを確認してください。
また、ハンドラをContentObserverで使用することをお勧めしますが、この場合、コードが間違っているわけではありません。
他のヒント
MannyNSの答えに関する簡単なヒント。
ここでは、 People.CONTENT_URI
は非推奨です。
代わりに次のようにコードします。-> ContactsContract.Contacts.CONTENT_URI
getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentobserver);
所属していません StackOverflow