簡體   English   中英

當且僅當ContactsContract.Contacts.CONTENT_URI更改時,ContentObserver才應調用

[英]ContentObserver should call if and only if ContactsContract.Contacts.CONTENT_URI changes

由於我的應用程序使用來自android.provider.ContactsContract.Data (API> 11)和ContactsContract.Contacts.CONTENT_URI (API <11)的內容來填充Contacts

我試圖對這些提供者registerContentObserver() 但即使我在撥打電話時嘗試通過設備呼叫某個人,它也會調用我的ContentObserver 它會觸發我的ContentObserver ,這對我ContentObserver ,因為Contacts Provider沒有內容更改。

根本原因:

好像LAST_TIME_CONTACTED或東西ContactsContract.Contacts.CONTENT_URI當呼叫已經從設備制造,其合法wokes增長做改變ContentObserver

嘗試:

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

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

Activity OnCreate()中注冊了ContentObserver

ContactsContentObserver contactsContentObserver = new ContactsContentObserver();
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, false, contactsContentObserver);

registerContentObserver上嘗試使用notifyForDescendentsfalse ContentObserver觸發ContentObserver

QUES:

當且僅當聯系人信息在除了Last_Time_Contacted或其后代之外的CRUD(創建,更新,刪除)下時,如何注冊ContentObserver

這里的根本問題是注冊ContactsContract.Contacts.CONTENT_URI無法正常工作。

即使notifyForDescendentsfalse您獲得更新的原因是因為觸發更新的Uri是... ContactsContract.Contacts.CONTENT_URI不是正在撥打的聯系人行。

聯系人應用程序中的違規代碼可以在GrepCode上找到,並且Google代碼上存在此錯誤。

因此,要回答您的問題, 您無法注冊將觸發聯系人特定字段的ContentObserver 你需要在你的應用程序中有一些東西,它會在onChange觸發時跟蹤計算差異。

由於android.provider.ContactsContract內容提供商有自己的復雜性,這使得ContentObserver很難僅通過contacts內容更改通知,除了它的LAST_TIME_CONTACTED字段,因為每個人都會說這些,所以它是。

ContentObserver通知時,無論contacts數據是否得到更新,都需要開發自己的邏輯。

要考慮構建邏輯是否真正得到更新contacts要點。

  • 檢查上次檢查的這些基礎。 取決於要求。
  • Service中添加ContentObserver ,這是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();
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM