Android 在电话簿更新时通知(内容观察者)

Posted

技术标签:

【中文标题】Android 在电话簿更新时通知(内容观察者)【英文标题】:Android notify when phone book is updated(Content Observer) 【发布时间】:2012-05-12 16:23:58 【问题描述】:

如果联系人数据库中有任何更改(添加,删除),我想在手机上收到通知。现在我正在使用 ContentObserver 来获取通知。以下是我的代码。问题是我无法知道哪个联系人变了。谁能帮忙???

public class ContentObserverActivity extends Activity 
    Button registerbutton;
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        registerbutton=(Button)findViewById(R.id.button1);
        registerbutton.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View v) 
            getContentResolver()
                .registerContentObserver(
                        ContactsContract.Contacts.CONTENT_URI, true,
                        new MyCOntentObserver());   
            
        );
    


    public class MyCOntentObserver extends ContentObserver
        public MyCOntentObserver() 
            super(null);
        
        @Override
        public void onChange(boolean selfChange) 
        super.onChange(selfChange);
            Log.e("","~~~~~~"+selfChange);
          

        @Override
        public boolean deliverSelfNotifications() 
            return true;
        
    

提前致谢。

【问题讨论】:

内容观察者不会告诉你哪一项改变了你必须通过查询和与旧数据进行比较来发现 语句'super(null);'很可疑。 【参考方案1】:

观察者不提供添加/更新/删除哪个联系人的信息。要了解这一点,请将联系人保存在您自己的数据库表中,并在观察者发送更改通知时使用系统的联系人检查它。

【讨论】:

【参考方案2】:

我已将 onChange 代码更改为此。

@Override
public void onChange (boolean selfChange)

    this.onChange(selfChange, null);


@Override
public void onChange (boolean selfChange,Uri uri)

  Cursor cursor = mCntxt.getContentResolver().query(
            ContactsContract.Contacts.CONTENT_URI, null, null, null,ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP + " Desc");
    if (cursor.moveToNext()) 
        String id = cursor.getString(
                cursor.getColumnIndex(ContactsContract.Contacts._ID));
        String name = cursor.getString(
                cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        Log.w("Contact ID", id);
        Log.w("Person Name",name);
       

希望这会有所帮助..

【讨论】:

如何知道联系人添加、删除或更新【参考方案3】:

我认为可以使用广播管理器/接收器 http://www.intertech.com/Blog/using-localbroadcastmanager-in-service-to-activity-communications/

【讨论】:

以上是关于Android 在电话簿更新时通知(内容观察者)的主要内容,如果未能解决你的问题,请参考以下文章

《Head First 设计模式》:观察者模式

打开系统相机时回电话

设计模式 观察者模式 以Android中TextView文本内容发生变化为背景

设计模式 观察者模式 以Android中TextView文本内容发生变化为背景

Android 推送通知的架构

在 Android 的正在进行的通知更新中禁用声音