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

hap*_*497 52 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);
Run Code Online (Sandbox Code Playgroud)

但是,当我使用' EditContactActivity'更改联系人数据库时,我的onChange()调用不会被调用.

Man*_*yNS 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);
        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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,你必须做错其他的事情.

您是否通过观察者注册的光标进行更改?

使用Observer函数deliverSelfNotifications()检查.(默认返回false)

您可能希望使用以下内容覆盖该观察者函数:

@Override
public boolean deliverSelfNotifications() {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

确保People.CONTENT_URI引用了正确的值(android.provider.Contacts.People).

另外,我建议你使用Handler和ContentObserver,虽然这不是在这种情况下你的代码错误的原因.

  • `onChange()` 多次调用内容更改。如何防止这种情况? (3认同)

Niz*_*zam 28

关于MannyNS答案的简单提示.

在这里,ContactsContract.Contacts.CONTENT_URI已弃用.

代码如下.-->People.CONTENT_URI

    getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentobserver);
Run Code Online (Sandbox Code Playgroud)

  • 在此ContentObserver中; 有没有办法获得添加或更改的联系人的详细信息?我想创建一个类似的监听器,但想要对添加/修改的联系人执行一些操作. (4认同)