2014-05-21 9 views
8

अपने आवेदन android.provider.ContactsContract.Data (एपीआई> 11) और ContactsContract.Contacts.CONTENT_URI (एपीआई < 11) से सामग्री का उपयोग करता है के रूप में Contacts को भरने के लिए।ContentObserver बुलाना चाहिए यदि और केवल यदि ContactsContract.Contacts.CONTENT_URI बदलता है

मैंने इन प्रदाताओं के विरुद्ध registerContentObserver() करने का प्रयास किया है। लेकिन यह मेरे ContentObserver को कॉल करता है भले ही मैं कॉल करने के बाद डिवाइस से किसी व्यक्ति को कॉल करने का प्रयास करता हूं। यह मेरे ContentObserver को ट्रिगर करता है जो मेरे लिए उपयोगी नहीं है क्योंकि Contacts Provider में कोई सामग्री परिवर्तन नहीं है।

मूल कारण:

LAST_TIME_CONTACTED या ContactsContract.Contacts.CONTENT_URI में परिवर्तन करते कुछ की तरह लगता है जब एक कॉल ContentObserver द्वारा जो वैध wokes डिवाइस से किया गया है।

की कोशिश की:

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

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

Activity

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

falseregisterContentObserver पर के रूप में notifyForDescendents साथ की कोशिश की की OnCreate() में ContentObserver पंजीकृत। फिर भी यह ContentObserver

प्रश्न बाहर चलाता है:

कैसे एक रजिस्टर कर सकते हैं ContentObserver जो से चलाता है, तो और संपर्क जानकारी CRUD (बनाएं, अपडेट करें हटाएँ) के तहत केवल तभी Last_Time_Contacted या उसके वंश को छोड़कर?

उत्तर

0

के रूप में।

इसे अपने स्वयं के तर्क विकसित करने की आवश्यकता है कि contacts डेटा अपडेट हो गया है या नहीं जब ContentObserver सूचित करता है।

तर्क बनाने पर विचार करने के लिए अंक contacts वास्तव में अपडेट हो जाते हैं या नहीं।

  • अंतिम बार चेक के इन आधार पर जांच कर रहा है। आवश्यकता पर निर्भर करता है।
  • Service में STICKY है, इसलिए जब संपर्क बदल जाएंगे तो यह वहां हो सकता है।

सिंक फोन बुक तर्क: -मैं SQLite का उपयोग कर, तो ऊपर है कि क्या है कि मौजूद है या नहीं और w.r.t इमारत तर्क जाँच संपर्क बनाए रखा गया है के रूप में।

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(); 
    } 
5

यहां मौलिक समस्या यह है कि ContactsContract.Contacts.CONTENT_URI के लिए पंजीकरण करना काम नहीं कर रहा है क्योंकि आप उचित रूप से सोच सकते हैं।

कारण है कि आप अद्यतन भले ही notifyForDescendentsfalse है क्योंकि Uri ट्रिगर अद्यतन है ... ContactsContract.Contacts.CONTENT_URI और नहीं संपर्क पंक्ति है कि डायल किए जा रहे है।

संपर्क ऐप में अपमानजनक कोड GrepCode पर पाया जा सकता है और Google Code पर इसके लिए एक बग दायर किया गया है।

तो अपने प्रश्न का उत्तर देने के लिए, आप ContentObserver पंजीकृत नहीं कर सकते हैं जो संपर्क पर विशिष्ट फ़ील्ड के लिए ट्रिगर करेगा। आपको अपने ऐप में कुछ होना होगा जो onChange आग के अंतरों की गणना करने का ट्रैक रखेगा। यह खुद जटिलता जो ContentObserver कठिन बना देता है केवल पर contacts सामग्री परिवर्तन को सूचित करने को छोड़कर यह LAST_TIME_CONTACTED क्षेत्र के रूप में हर साथी के पार चलो इन कहना है और इसलिए यह है android.provider.ContactsContract सामग्री प्रदाता है

संबंधित मुद्दे