2009-09-09 23 views
51

Estoy tratando de escuchar cualquier cambio en la base de datos de contactos.cómo escuchar los cambios en la base de datos de contacto

Así que creo mi contentObserver que es una clase hija de ContentObserver:

private class MyContentObserver extends ContentObserver { 

     public MyContentObserver() { 
      super(null); 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange); 
      System.out.println (" Calling onChange"); 
     } 

    } 

MyContentObserver contentObserver = new MyContentObserver(); 
context.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver); 

pero cuando se utiliza 'EditContactActivity' para cambiar la base de datos de contactos, Mi onChange() no se consiga llamar.

+3

FYI - el URI People.CONTENT_URI está en desuso (antes de hoy - 3/15/2011). Consulte ContactsContract.Contacts.CONTENT_URI. – mobibob

+1

Hola, ¿Alguna idea sobre cómo obtengo información sobre la naturaleza del cambio? ¿Contacto agregado, eliminado, actualizado, los campos actualizados? –

Respuesta

53

He implementado su ejemplo tal como está, y funciona bien.

package com.test.contentobserver; 

import android.app.Activity; 
import android.database.ContentObserver; 
import android.os.Bundle; 
import android.provider.Contacts.People; 

public class TestContentObserver extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     this.getApplicationContext().getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver); 
    } 

    private class MyContentObserver extends ContentObserver { 

     public MyContentObserver() { 
      super(null); 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange); 
     } 

    } 

    MyContentObserver contentObserver = new MyContentObserver(); 

} 

Entonces, debe estar haciendo otra cosa mal.

¿Está realizando los cambios mediante el cursor con el que está registrado el observador?

Compruebe que con la función Observer deliverSelfNotifications(). (Devuelve false por defecto)

es posible que desee anular esa función de observador con algo como:

@Override 
public boolean deliverSelfNotifications() { 
    return true; 
    } 

Asegúrese de que People.CONTENT_URI se refiere al valor correcto (android.provider.Contacts.People) .

Además, le sugiero que use Handler con ContentObserver, aunque eso no es lo que hace que su código sea incorrecto en este caso.

+1

Es extraño que funcione sin controlador para usted. No fue para mí. Además, realmente me pregunto cómo puedes hacer que tu código se ejecute en el hilo de la interfaz de usuario ... Aunque me puede estar perdiendo algo, soy nuevo en este tema. – Snicolas

+0

¿Cómo puedo saber si los contactos se han actualizado en la libreta de direcciones – user366584

+0

¿Hay algún evento que corresponda a los cambios de Contactos para incluirlos en el archivo de manifiesto para no mantener el servicio de mi aplicación en la memoria? – kolyaseg

27

Un simple SUGETAR sobre la respuesta de MannyNS.

Aquí, People.CONTENT_URI está obsoleto.

Código de la siguiente vez .-->ContactsContract.Contacts.CONTENT_URI

getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentobserver); 
+4

En este ContentObserver; ¿Hay alguna manera de obtener detalles del contacto que se agregó o cambió? Quiero crear un oyente similar pero quiero realizar alguna operación en el contacto agregado/modificado. – Allzhere

+0

Hasta donde yo sé, no es posible usar 'CotentObserver'. Consulte este [enlace] (http://stackoverflow.com/a/10432259/2124004) – Nizam

Cuestiones relacionadas