Skip to content Skip to sidebar Skip to footer

Contentobserver Should Call If And Only If Contactscontract.contacts.content_uri Changes

As my application uses content from android.provider.ContactsContract.Data (API > 11) and ContactsContract.Contacts.CONTENT_URI (API < 11) to populate Contacts. I've tried to

Solution 1:

The fundamental problem here is that registering for ContactsContract.Contacts.CONTENT_URI isn't working as you might reasonably think.

The reason why you get updates even if notifyForDescendents is false is because the Uri triggering the update is... ContactsContract.Contacts.CONTENT_URI and not the contact row that is being dialled.

The offending code in the Contacts app can be found at GrepCode and there is a bug filed for this on Google Code.

So to answer your question, you can't register a ContentObserver which will trigger for specific fields on a contact. You would need to have something in your app which will keep track of calculating the differences whenever onChange fires.

Solution 2:

As android.provider.ContactsContract content provider has it's own complexity which makes ContentObserver tough to notify only on contacts content change except it's LAST_TIME_CONTACTED field as every fellow come across say these and so it is.

One need to develop it's own logic whether contacts data get updated or not when ContentObserver notifies.

Points to consider building logic whether contacts really get updated or not.

  • Checking on these basis of Last Time checked. Depends on the requirement.
  • Adding ContentObserver in Service which is STICKY so it can be there when contacts get change.

Sync Phone Book Logic :-As I've maintained contacts using SQLite, so checking up whether that exist or not and w.r.t building logic.

ContentValues values;
Cursor cursor = Zname.getApplication().getContentResolver().query(DBConstant.All_Contacts_Columns.CONTENT_URI,null,DBConstant.All_Contacts_Columns.COLUMN_CONTACT_NUMBER+ "=?",newString[] { _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+ "?=",newString[] { _contact.getContactNumber() });
        Log.i(TAG, "Updating zname phonebook");
        values = newContentValues();
        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();
   }

Post a Comment for "Contentobserver Should Call If And Only If Contactscontract.contacts.content_uri Changes"