2009-09-09 19 views
51

Próbuję odsłuchać każdej zmiany w bazie danych kontaktów.Sposób odsłuchiwania zmian w bazie danych kontaktów

Więc tworzę contentObserver który jest klasa dzieckiem 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); 

ale kiedy używam „EditContactActivity”, aby zmienić bazę kontaktów, My onChange() nie zostanie wywołana.

+3

FYI - URI People.CONTENT_URI jest przestarzała (przed dzisiaj - 3/15/2011). Zobacz KontaktyContract.Contacts.CONTENT_URI. – mobibob

+1

Witam, Jakieś pomysły na to, w jaki sposób uzyskać informacje na temat charakteru zmiany? Kontakt został dodany, usunięty, zaktualizowany, pola zaktualizowane? –

Odpowiedz

53

Zainstalowałem twój przykład taki jaki jest i działa dobrze.

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

} 

Musisz więc robić coś złego.

Czy wprowadzasz zmiany za pomocą kursora, w którym zarejestrowany jest obserwator?

Sprawdź to za pomocą funkcji Observer deliverSelfNotifications(). (Zwraca false domyślnie)

Możesz zastąpić tę funkcję obserwatora z czymś takim:

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

Upewnij się, że People.CONTENT_URI odnosi się do skorygowania wartości (android.provider.Contacts.People) .

Proponuję także użycie Handler'a z ContentObserver, ale to nie jest to, co powoduje, że kod jest nieprawidłowy w tym przypadku.

+1

Dziwne, że działa bez Handler'a. To nie dla mnie. Co więcej, naprawdę zastanawiam się, w jaki sposób można uzyskać kod wykonany na wątku UI ... Być może brakuje mi czegoś, jestem nowy w tym temacie. – Snicolas

+0

Skąd mogę wiedzieć, że kontakty zostały zaktualizowane w książce adresowej – user366584

+0

Czy są jakieś zdarzenia odpowiadające zmianom w Kontaktach, aby uwzględnić je w pliku manifestu, aby nie przechowywać usługi mojej aplikacji w pamięci? – kolyaseg

27

Prosta RADA o odpowiedzi MannyNS.

Tutaj, People.CONTENT_URI jest przestarzałe.

Kod następująco zamiast .-->ContactsContract.Contacts.CONTENT_URI

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

W tym ContentObserver; Czy istnieje sposób na uzyskanie szczegółów kontaktu, który został dodany lub zmieniony? Chcę utworzyć podobnego słuchacza, ale chcę wykonać operację na dodanym/zmodyfikowanym kontakcie. – Allzhere

+0

O ile mi wiadomo, nie jest to możliwe przy użyciu 'CotentObserver'. Zobacz ten [link] (http://stackoverflow.com/a/10432259/2124004) – Nizam

Powiązane problemy