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

54

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

因此,我创建了一个继承自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() 没有被调用。


3
请注意 - URI People.CONTENT_URI 已经过时(早于2011年3月15日)。请使用 ContactsContract.Contacts.CONTENT_URI。 - mobibob
1
你好,有什么想法可以让我获取关于更改的性质信息吗?联系人添加、删除、更新,以及更新的字段是什么? - Alex Poke
2个回答

54

我已经按照您的示例部署,它可以正常工作。

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函数deliverSelfNotifications()来确定(默认情况下返回false)。

您可能需要使用类似以下内容覆盖观察者函数:

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

1
很奇怪,它在你那里没有处理程序也能工作。但是在我这里不行。此外,我真的很想知道你如何在UI线程上执行代码...虽然我可能遗漏了什么,因为我对这个主题还很陌生。 - Snicolas
我如何知道通讯录中的联系人已被更新 - user366584
有没有与联系人更改相对应的事件,可以将它们包含在清单文件中,以免将我的应用程序服务保留在内存中? - kolyaseg
警告!!!People.CONTENT_URI 已被弃用,请使用ContactsContract.Contacts.CONTENT_URI。 - David
3
在内容更改时,onChange()会多次调用,如何防止这种情况发生? - Sagar

28

编辑:MannyNS的答案现已更新为新的URI (ContactsContract.Contacts.CONTENT_URI)

关于MannyNS答案的一个简单提示。

这里,People.CONTENT_URI已经过时了。

请改用以下代码:ContactsContract.Contacts.CONTENT_URI

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

5
在这个ContentObserver中,有没有一种方法可以获取添加或修改的联系人的详细信息?我想创建一个类似的监听器,但是希望在添加/修改联系人时执行一些操作。 - Allzhere
据我所知,使用ContentObserver是不可能的。请参考此链接:https://dev59.com/Y2PVa4cB1Zd3GeqP5Wrg#10432259 - Nizam
我认为这不应该是一个单独的答案。我认为你应该编辑原始内容并添加弃用说明。 - blueberry_chopsticks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接