【问题标题】:How to know which specific contact was updated in android?如何知道在android中更新了哪个特定联系人?
【发布时间】:2012-05-03 12:58:23
【问题描述】:

我能够收到“联系人数据库发生更改”的一般通知,但我想知道插入、更新或删除的特定记录。

我不想使用查找 URI 概念,因为我不想为每个联系人单独设置查找 URI。我想要一个通用的解决方案,当任何联系人被更新或删除时我可以知道。

【问题讨论】:

    标签: android contacts addressbook


    【解决方案1】:

    您可以实现Service 来查看数据库状态。

    import android.app.Service;
    import android.content.Intent;
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.os.Handler;
    import android.os.IBinder;
    import android.provider.ContactsContract;
    
    public class ContactService extends Service {
    
    private int mContactCount;
    
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
        mContactCount = getContactCount();
        this.getContentResolver().registerContentObserver(
                ContactsContract.Contacts.CONTENT_URI, true, mObserver);
    }
    
    private int getContactCount() {
        Cursor cursor = null;
        try {
            cursor = getContentResolver().query(
                    ContactsContract.Contacts.CONTENT_URI, null, null, null,
                    null);
            if (cursor != null) {
                return cursor.getCount();
            } else {
                return 0;
            }
        } catch (Exception ignore) {
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
        return 0;
    }
    
    private ContentObserver mObserver = new ContentObserver(new Handler()) {
    
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
    
            final int currentCount = getContactCount();
            if (currentCount < mContactCount) {
                // DELETE HAPPEN.
            } else if (currentCount == mContactCount) {
                // UPDATE HAPPEN.
            } else {
                // INSERT HAPPEN.
            }
                        mContactCount = currentCount;
        }
    
    };
    
        @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        getContentResolver().unregisterContentObserver(mObserver);
     }
    
    }
    

    【讨论】:

    • 感谢姚昌伟的回复。使用您的代码,我必须知道联系人数据库已更新或删除,但我想确切知道哪个联系人已更新或删除。你对此有什么想法吗?
    • 每个联系人都有自己的版本。你可以自己录制。但是没有 API 可以知道哪个联系人被更改了。
    • @ChangweiYao 你能详细说明如何记录联系人的版本吗?谢谢
    • else if (currentCount == mContactCount) { // 更新发生。每次都会调用它,在此基础上我应该如何知道哪些联系人已更新,所以我应该每次都循环访问联系人
    【解决方案2】:

    我通过以下方式实现了这个问题:

    在安装应用程序期间,我本地数据库的联系人表正在由给定时间的联系人初始化。然后所有呼叫都由 CallListner 跟踪:如果用户接听/拨打电话,我检查该号码是否在用户的当前电话簿中,如果是,我检索与该号码相关的所有联系信息并更新我的本地数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多