当且仅当ContactsContract.Contacts.CONTENT_URI更改时,ContentObserver才应调用

时间:2014-05-21 12:35:32

标签: android android-contentprovider contentobserver

由于我的应用程序使用来自android.provider.ContactsContract.Data(API> 11)和ContactsContract.Contacts.CONTENT_URI(API< 11)的内容来填充Contacts

我尝试registerContentObserver()针对这些提供商。但是,即使我在拨打电话时尝试通过设备呼叫某个人,它也会调用ContentObserver。它会触发我的ContentObserver,这对我没用,因为Contacts Provider中没有内容更改。

根本原因:

LAST_TIME_CONTACTEDContactsContract.Contacts.CONTENT_URI中的某些内容似乎发生了更改,当设备通过ContentObserver合法唤醒时发生了更改。

尝试:

private class ContactsContentObserver extends ContentObserver {
    public ContactsContentObserver() {
        super(null);
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Zname.getPreferences().setRefreshContact(true);
    }
}

ContentObserver

OnCreate()中注册Activity
ContactsContentObserver contactsContentObserver = new ContactsContentObserver();
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, false, contactsContentObserver);

notifyForDescendents上使用false作为registerContentObserver进行了尝试。仍然会触发ContentObserver

QUES:

当且仅当联系人信息在ContentObserver或其后代以外的CRUD(创建,更新,删除)下时,如何注册触发Last_Time_Contacted

2 个答案:

答案 0 :(得分:5)

这里的根本问题是注册ContactsContract.Contacts.CONTENT_URI无法正常运作。

即使notifyForDescendentsfalse,您获得更新的原因是因为触发更新的Uri是...... ContactsContract.Contacts.CONTENT_URI不是正在拨打的联系人行。

可以在GrepCode找到“联系人”应用中的违规代码,并在Google Code上存在此错误。

因此,要回答您的问题,您无法注册ContentObserver,这会触发联系人的特定字段。您需要在应用中添加一些内容才能跟踪在onChange开火时计算差异。

答案 1 :(得分:0)

由于android.provider.ContactsContract内容提供商有自己的复杂性,因此ContentObserver很难仅通过contacts内容更改通知,除了LAST_TIME_CONTACTED字段,因为每个人都会说这些和所以它是。

contacts通知时,是否需要ContentObserver数据得到更新,就需要开发自己的逻辑。

要考虑构建逻辑是否contacts是否真正得到更新。

  • 检查上次检查的这些基础。取决于要求。
  • ContentObserver Service中添加STICKY,以便在联系人发生变化时可以在那里。

同步电话簿逻辑: - 由于我使用SQLite维护了联系人,因此请检查是否存在,并建立逻辑。

ContentValues values;
Cursor cursor = Zname.getApplication().getContentResolver().query(DBConstant.All_Contacts_Columns.CONTENT_URI,null,DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER+ "=?",new String[] { _contact.getContactNumber() },null);

 if (cursor.getCount() <= 0) {
        cursor.moveToFirst();
        Zname.getApplication().getContentResolver().delete(DBConstant.All_Contacts_Columns.CONTENT_URI,DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER+ "?=",new String[] { _contact.getContactNumber() });
        Log.i(TAG, "Updating zname phonebook");
        values = new ContentValues();
        values.put(DBConstant.All_Contacts_Columns.COLUMN_CONTACT_ID,_contact.getContactId());
        values.put(DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER,_contact.getContactNumber());
        values.put(DBConstant.All_Contacts_Columns.COLUMN_DISPLAY_NAME,_contact.getContactName());
        values.put(DBConstant.All_Contacts_Columns.COLUMN_ZNAME_DP_URL_SMALL,_contact.getContactPhotoUri().toString());

        Zname.getApplication().getContentResolver().insert(DBConstant.All_Contacts_Columns.CONTENT_URI,values);

        if (cursor != null)
              cursor.close();
   }