2009-09-09 19 views
51

Sto cercando di ascoltare qualsiasi modifica nel database dei contatti.come ascoltare le modifiche nel database dei contatti

Così Creo il mio contentObserver che è una classe figlia di 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); 

ma quando uso 'EditContactActivity' per modificare il database dei contatti, il mio onChange() non viene chiamato.

+3

CRONACA - l'URI People.CONTENT_URI è disapprovato (prima di oggi - 2011/03/15). Fare riferimento a ContactsContract.Contacts.CONTENT_URI. – mobibob

+1

Ciao, qualche idea su come ottenere informazioni sulla natura del cambiamento? Contatto aggiunto, cancellato, aggiornato, i campi aggiornati? –

risposta

53

Ho distribuito il tuo esempio così com'è e funziona perfettamente.

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

} 

Quindi, devi fare qualcos'altro di sbagliato.

State facendo le modifiche tramite il cursore con cui è registrato l'osservatore?

Verificare che con la funzione Observer deliverSelfNotifications(). (Restituisce false di default)

si può decidere di ignorare che la funzione di osservatore con qualcosa di simile:

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

Assicurarsi che People.CONTENT_URI si riferisce a correggere il valore (android.provider.Contacts.People) .

Inoltre, suggerirei di utilizzare Handler con ContentObserver, anche se questo non è ciò che rende il codice sbagliato in questo caso.

+1

Strano che funzioni senza Handler per te. Non ha fatto per me. Inoltre, mi chiedo davvero come si possa ottenere il codice eseguito sul thread dell'interfaccia utente ... Mi mancherà comunque qualcosa, sono nuovo su questo argomento. – Snicolas

+0

Come posso sapere che i contatti sono stati aggiornati in Addressbook – user366584

+0

Esistono eventi corrispondenti alle modifiche di Contatti per includerli nel file manifest per non conservare il servizio della mia app in memoria? – kolyaseg

27

Un semplice SUGGERIMENTO sulla risposta di MannyNS.

Qui, People.CONTENT_URI è deprecato.

codice come segue invece .-->ContactsContract.Contacts.CONTENT_URI

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

In questo ContentObserver; C'è un modo per ottenere dettagli di contatto aggiunti o modificati ?? Voglio creare un listener simile ma voglio eseguire alcune operazioni sul contatto aggiunto/modificato. – Allzhere

+0

Per quanto ne so, non è possibile utilizzare 'CotentObserver'. Fare riferimento a questo [collegamento] (http://stackoverflow.com/a/10432259/2124004) – Nizam

Problemi correlati