2014-05-21 16 views
8

Come la mia applicazione utilizza contenuti da android.provider.ContactsContract.Data (API> 11) e ContactsContract.Contacts.CONTENT_URI (API < 11) per popolare Contacts.ContentObserver dovrebbe chiamare se e solo se ContactsContract.Contacts.CONTENT_URI cambia

Ho provato a registerContentObserver() contro questi provider. Ma chiama il mio ContentObserver anche se provo a chiamare una persona dal dispositivo non appena ho messo la chiamata. Attiva il mio ContentObserver che non è utile per me in quanto non vi è alcuna modifica del contenuto in Contacts Provider.

Root Cause:

Sembra LAST_TIME_CONTACTED o qualcosa in ContactsContract.Contacts.CONTENT_URI fare modifiche quando una chiamata è stata fatta dal dispositivo che wokes legittimi da ContentObserver.

provato:

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

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

Registrato ContentObserver in OnCreate() di Activity

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

provato con notifyForDescendents come false su registerContentObserver. Ancora si innesca fuori ContentObserver

Ques:

Come si può registrare ContentObserver che innesca se e solo se le informazioni dei contatti è in fase di CRUD (Create, Update, Delete) ad eccezione Last_Time_Contacted o dei suoi discendenti?

risposta

0

Come android.provider.ContactsContract fornitore di contenuti ha il proprio complessità che rende ContentObserver difficile da comunicare solo su contacts cambiamento contenuto tranne che è LAST_TIME_CONTACTED campo come ogni compagno di venire attraverso dire questi e così è.

Una necessità di sviluppare la propria logica se i dati contacts vengono aggiornati o meno quando si notifica ContentObserver.

Punti da considerare la logica di costruzione se contacts viene veramente aggiornato o meno.

  • Controllare su questa base dell'ultima ora selezionata. Dipende dal requisito
  • Aggiunta ContentObserver in Service che è STICKY in modo che possa essere lì quando i contatti ottengono il cambiamento.

Sync Rubrica Logic: -Come ho mantenuto i contatti con SQLite, in modo da controllare se fino che esistano o meno e la logica edificio 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

Il problema fondamentale qui è che la registrazione per ContactsContract.Contacts.CONTENT_URI non funziona come si potrebbe ragionevolmente pensare.

Il motivo per cui si ottiene aggiornamenti anche se notifyForDescendents è false perché il Uri innescando l'aggiornamento è ... ContactsContract.Contacts.CONTENT_URI e non la riga contatto che è composto.

Il codice offendente nell'app Contatti è reperibile al numero GrepCode e su questo è presente un bug su Google Code.

Quindi, per rispondere alla tua domanda, non è possibile registrare uno ContentObserver che verrà attivato per campi specifici su un contatto. Avresti bisogno di avere qualcosa nella tua app che tenga traccia del calcolo delle differenze ogni volta che gli incendi sono onChange.