如何监听联系人数据库的变化

Posted

技术标签:

【中文标题】如何监听联系人数据库的变化【英文标题】:how to listen for changes in Contact Database 【发布时间】:2010-11-26 22:35:36 【问题描述】:

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

所以我创建了我的 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() 不会被调用。

【问题讨论】:

仅供参考 - 不推荐使用 URI People.CONTENT_URI(在今天之前 - 2011 年 3 月 15 日)。请参阅 ContactsContract.Contacts.CONTENT_URI。 嗨,关于如何获取有关更改性质的信息的任何想法?联系人添加、删除、更新、字段更新? 【参考方案1】:

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

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;

【讨论】:

奇怪的是它在没有处理程序的情况下为您工作。它不适合我。此外,我真的很想知道如何让你的代码在 UI 线程上执行......虽然我可能遗漏了一些东西,但我是这个主题的新手。 如何知道通讯录中的联系人已更新 是否有任何与联系人更改相对应的事件以将它们包含到清单文件中以不将我的应用程序的服务保存在内存中? 警告!!! People.CONTENT_URI 已弃用,请改用 ContactsContract.Contacts.CONTENT_URI。 onChange() 多次调用内容更改。如何防止这种情况发生?【参考方案2】:

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

关于 MannyNS 答案的简单提示。

这里,People.CONTENT_URI 已弃用。

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

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

【讨论】:

在这个 ContentObserver 中;有没有办法获取添加或更改的联系人详细信息?我想创建一个类似的监听器,但想对添加/修改的联系人执行一些操作。 据我所知,使用CotentObserver 是不可能的。参考这个link 我不认为这应该是一个单独的答案。我认为您应该编辑原件以添加弃用说明。

以上是关于如何监听联系人数据库的变化的主要内容,如果未能解决你的问题,请参考以下文章

Android ContenObserver 监听联系人数据变化

用于监听联系人变化的 ContentObserver

Android - 监听 android 联系人的变化并获取 deltas

联系人 ContentObserver 随机调用

Android 如何检测更改了哪个联系人?

硅谷社交11--主页面中的会话列表页面