ContentObserver debe llamar si y sólo si ContactsContract.Contacts.CONTENT_URI cambia

Como mi aplicación utiliza contenido de android.provider.ContactsContract.Data (API> 11) y ContactsContract.Contacts.CONTENT_URI (API <11) para rellenar Contacts .

He intentado registerContentObserver() contra este proveedor. Pero llama a mi ContentObserver incluso si trato de llamar a una persona desde el dispositivo tan pronto como pongo la llamada. Se ContentObserver mi ContentObserver que no es útil para mí, ya que no hay ningún cambio de contenido en el Contacts Provider .

Causa principal:

Parece como LAST_TIME_CONTACTED o algo en ContactsContract.Contacts.CONTENT_URI hacer cambios cuando se ha hecho una llamada desde el dispositivo que legítima se activa por ContentObserver .

Intentó:

 private class ContactsContentObserver extends ContentObserver { public ContactsContentObserver() { super(null); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Zname.getPreferences().setRefreshContact(true); } } 

Registered ContentObserver en OnCreate() de Activity

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

Intentado con notifyForDescendents como false en registerContentObserver . Aún así, desencadena ContentObserver

Ques

¿Cómo se puede registrar un ContentObserver que se activa si y sólo si la información de los contactos está bajo CRUD (Create, Update, Delete) excepto Last_Time_Contacted o sus descendientes?

El problema fundamental aquí es que registrarse en ContactsContract.Contacts.CONTENT_URI no está funcionando como usted podría razonablemente pensar.

La razón por la que obtiene actualizaciones incluso si notifyForDescendents es false es porque el Uri desencadena la actualización es … ContactsContract.Contacts.CONTENT_URI y no la fila de contactos que se está marcando.

El código ofensivo en la aplicación de Contactos se puede encontrar en GrepCode y hay un error presentado para esto en Google Code .

Así que para responder a su pregunta, no puede registrar un ContentObserver que activará para campos específicos de un contacto. Usted tendría que tener algo en su aplicación que se mantendrá al tanto de calcular las diferencias cuando se onChange incendios.

Como proveedor de contenido de android.provider.ContactsContract tiene su propia complejidad que hace que ContentObserver sea ​​difícil de notificar sólo en el cambio de contenido de contacts , excepto que es el campo LAST_TIME_CONTACTED ya que todos los compañeros se LAST_TIME_CONTACTED ellos y así es.

Es necesario desarrollar su propia lógica si los datos de los contacts se actualizan o no cuando se notifica a ContentObserver .

Puntos a considerar la construcción de la lógica si los contacts realmente se actualiza o no.

  • Comprobación sobre estas bases de la última vez marcada. Depende del requisito.
  • Añadir ContentObserver en el Service que es STICKY para que pueda estar allí cuando los contactos obtener cambio.

Sync Phone Book Logic: – Como he mantenido los contactos utilizando SQLite, por lo que comprobar si existe o no y wrt la construcción de la lógica.

 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(); } 
  • Cómo detectar nuevas aplicaciones en un dispositivo Android
  • ¿Cómo utilizar ContentObserver con RecyclerView?
  • Observación de cambios en el observador de contenido android de Audio.Media.EXTERNAL_CONTENT_URI
  • Por qué y cuándo anular el registro de observadores de contenido en android
  • ¿Por qué el ContentObserver se llama varias veces?
  • ¿Cómo hago que mi Android ContentObserver para ContactsContract detecte un contacto añadido, actualizado o eliminado?
  • Cómo el observador de contenido trabaja en archivos eliminados?
  • Recibir cambios de contacto (agregados, eliminados y cambiados)
  • Android notifica cuando se actualiza la guía telefónica (Observador de contenido)
  • Cuando se llama a ContentResolver.notifyChange () para un URI determinado, ContentObservers observa los URI descendientes de este URI notificados?
  • El método ContentObserver onChange () se llama muchas veces
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.