2009-09-09 5 views
51

J'essaie d'écouter tout changement dans la base de données de contacts.comment écouter les changements dans la base de données de contacts

Je crée mon contentObserver qui est une classe enfant 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); 

Mais quand j'utilise « EditContactActivity » pour changer la base de données de contact, mon onChange() ne soit pas appelé.

+3

Pour votre information - l'URI People.CONTENT_URI est dépréciée (avant aujourd'hui - 3/15/2011). Reportez-vous à ContactsContract.Contacts.CONTENT_URI. – mobibob

+1

Salut, Toutes les idées sur comment puis-je obtenir des informations sur la nature du changement? Contact ajouté, supprimé, mis à jour, les champs mis à jour? –

Répondre

53

J'ai déployé votre exemple tel qu'il est, et cela fonctionne 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(); 

} 

Donc, vous devez faire autre chose de mal.

Apportez-vous les modifications via le curseur avec lequel l'observateur est enregistré?

Vérifiez avec la fonction Observer deliverSelfNotifications(). (Elle retourne false par défaut)

Vous pouvez vouloir passer outre cette fonction d'observateur avec quelque chose comme:

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

Assurez-vous que People.CONTENT_URI fait référence à corriger la valeur (android.provider.Contacts.People) .

Aussi, je vous suggère d'utiliser Handler avec ContentObserver, bien que ce n'est pas ce qui rend votre code incorrect dans ce cas.

+1

Étrange que cela fonctionne sans gestionnaire pour vous. Ce n'est pas pour moi. De plus, je me demande vraiment comment vous pouvez faire exécuter votre code sur le Thread UI ... Il se peut que je manque quelque chose, je suis nouveau sur ce sujet. – Snicolas

+0

Comment puis-je savoir que les contacts ont été mis à jour dans le répertoire – user366584

+0

Y a-t-il des événements correspondant aux modifications apportées aux contacts pour les inclure dans le fichier manifeste afin de ne pas conserver le service de mon application en mémoire? – kolyaseg

27

Un simple conseil sur la réponse de MannyNS.

Ici, People.CONTENT_URI est déprécié.

code comme suit au lieu .-->ContactsContract.Contacts.CONTENT_URI

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

Dans ce ContentObserver; Y at-il un moyen d'obtenir des détails de contact qui ont ajouté ou changé ?? Je veux créer un écouteur similaire, mais je veux effectuer une opération sur un contact ajouté/modifié. – Allzhere

+0

Pour autant que je sache, il n'est pas possible d'utiliser 'CotentObserver'. Reportez-vous à ce [lien] (http://stackoverflow.com/a/10432259/2124004) – Nizam

Questions connexes