如何监听联系人数据库中的更改

时间:2009-09-09 18:26:32

标签: android

我正在尝试收听联系人数据库中的任何更改。

所以我创建了我的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 个答案:

答案 0 :(得分:53)

我已按原样部署了您的示例,并且工作正常。

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)。

此外,我建议您使用Handler和ContentObserver,但这不是导致您的代码错误的原因。

答案 1 :(得分:29)

关于MannyNS答案的简单提示。

此处,People.CONTENT_URI已弃用。

代码如下.--> ContactsContract.Contacts.CONTENT_URI

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