如何让我的 Android ContentObserver for ContactsContract 检测添加、更新或删除的联系人? [英] How do I make my Android ContentObserver for ContactsContract detect a added, updated or deleted contact?

查看:26
本文介绍了如何让我的 Android ContentObserver for ContactsContract 检测添加、更新或删除的联系人?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够收到联系人数据库发生更改"的通用通知,但我想知道插入、更新或删除的特定记录.以下是注册并获取 onChange 通知的代码.不幸的是,它并不具体,这使我的处理变得详尽且效率低下.

这是代码存根:

 if ((mNativeContactsObserver == null) && (mHandler == null)) {mHandler = new Handler(this.getMainLooper()) {};mNativeContactsObserver = 新的 ContentObserver(mHandler) {@覆盖公共无效onChange(布尔值selfChange){super.onChange(selfChange);捆绑数据=空;Message message = mHandler.obtainMessage();如果(消息!= null){数据 = message.getData();如果(数据!= null){Logs.d(TAG, "Message = [" + message.toString() + "] data=[" + data.toString() + "]");Logs.d(TAG, "Contents = [" + message.describeContents() + "]");}}如果(!selfChange){最终帐户 accountListen = MySyncAdapter.lookupAccount(TAG, getApplicationContext(), getUserProfile().getAccountId(), AUTHORITY_MY_SYNC);Logs.d(TAG, "onChange!? account: " + accountListen.name);if (!ContentResolver.isSyncPending(account, ContactsContract.AUTHORITY)&&(!ContentResolver.isSyncActive(account, ContactsContract.AUTHORITY))) {Bundle extras = new Bundle();extras.putInt(MySyncAdapter.EXTRA_SYNC_TYPE, MySyncAdapter.REQUEST_SYNC_NATIVE_CHANGED);ContentResolver.requestSync(accountListen, ContactsContract.AUTHORITY, extras);} 别的 {Logs.w(TAG, "有一个挂起的同步.这个请求被忽略了.");}}}};}Uri uriContactsListen = ContactsContract.Contacts.CONTENT_URI.buildUpon().appendEncodedPath("#").build();Logs.i(TAG, "注册监听本机联系人更改.[" + uriContactsListen + "]");cr.registerContentObserver(uriContactsListen, true, mNativeContactsObserver);

解决方案

最后至少我能够检测到是这个 Update/Delete/Insert 看看我的 OnChange方法如下

 @Override公共无效onChange(布尔值selfChange){super.onChange(selfChange);Log.e("ContactChangeObserver", "onChange");//0 更新,1 删除,2 添加//从电话联系人中获取计数final int currentCount = contactDBOperaion.getContactsCountFromPhone();//从你的 sqlite 数据库中获取计数int mContactCount= DbContacts.getInstance().getContactsCount();如果(currentCount 

<块引用>

更新发生时,我更新所有联系人

Insert 发生时,我正在插入新添加的行,经过检查is存在于现有数据库中

删除发生时,还没有找到解决方案

I am able to get a generic notification "that there was a change to the contacts DB", but I want to know the specific record that was inserted, updated, or deleted. Following is the code that gets registered and gets the onChange notification. Unfortunately, it is not specific which makes my processing exhaustive and inefficient.

Here is the code stub:

            if ((mNativeContactsObserver == null) && (mHandler == null)) {
            mHandler = new Handler(this.getMainLooper()) {
            };
            mNativeContactsObserver = new ContentObserver(mHandler) {
                @Override
                public void onChange(boolean selfChange) {
                    super.onChange(selfChange);

                    Bundle data = null;
                    Message message = mHandler.obtainMessage();
                    if (message != null) {
                        data = message.getData();
                        if (data != null) {
                            Logs.d(TAG, "Message = [" + message.toString() + "] data=[" + data.toString() + "]");
                            Logs.d(TAG, "Contents = [" + message.describeContents() + "]");
                        }
                    }

                    if (!selfChange) {
                        final Account accountListen = MySyncAdapter.lookupAccount(TAG, getApplicationContext(), getUserProfile().getAccountId(), AUTHORITY_MY_SYNC);
                        Logs.d(TAG, "onChange!? account: " + accountListen.name);
                        if (!ContentResolver.isSyncPending(account, ContactsContract.AUTHORITY) 
                                && (!ContentResolver.isSyncActive(account, ContactsContract.AUTHORITY))) {
                            Bundle extras = new Bundle();
                            extras.putInt(MySyncAdapter.EXTRA_SYNC_TYPE, MySyncAdapter.REQUEST_SYNC_NATIVE_CHANGED);
                            ContentResolver.requestSync(accountListen, ContactsContract.AUTHORITY, extras);
                        } else {
                            Logs.w(TAG, "There is a pending sync.  This request is ignored.");
                        }
                    }
                }
            };
        }
        Uri uriContactsListen = ContactsContract.Contacts.CONTENT_URI.buildUpon().appendEncodedPath("#").build();
        Logs.i(TAG, "Register listening for native contacts changes. [" + uriContactsListen + "]");
        cr.registerContentObserver(uriContactsListen, true, mNativeContactsObserver);

解决方案

Finally at least i am able to detect is this Update/Delete/Insert look at my OnChange method as below

 @Override
       public void onChange(boolean selfChange) {
           super.onChange(selfChange);
           Log.e("ContactChangeObserver", "onChange");

           // 0 Update , 1 Delete , 2 Added
 // Get count from phone contacts
           final int currentCount = contactDBOperaion.getContactsCountFromPhone();

 // Get count from your sqlite database
           int mContactCount= DbContacts.getInstance().getContactsCount();

           if (currentCount < mContactCount) {
               // DELETE HAPPEN.
               Log.e("Status", "Deletion");
               contactDBOperaion.SyncContacts(1);
           } else if (currentCount == mContactCount) {
               // UPDATE HAPPEN.
               contactDBOperaion.SyncContacts(0);
           } else {
               // INSERT HAPPEN.
               Log.e("Status", "Insertion");
               contactDBOperaion.SyncContacts(2);
           }
       }

When Update occurred i update all contacts

When Insert occurred i am inserting newly added row , after checking isExist in existing database

When Delete occurred not found solution yet

这篇关于如何让我的 Android ContentObserver for ContactsContract 检测添加、更新或删除的联系人?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆