ContentObserver sollte nur dann aufrufen, wenn sich ContactsContract.Contacts.CONTENT_URI ändert

9

Da meine Anwendung Inhalte von android.provider.ContactsContract.Data (API & gt; 11) und ContactsContract.Contacts.CONTENT_URI (API & lt; 11) verwendet, um Contacts zu füllen.

Ich habe registerContentObserver() gegen diesen Anbieter versucht. Aber es ruft mein ContentObserver an, auch wenn ich versuche, eine Person vom Gerät anzurufen, sobald ich den Anruf getätigt habe. Es löst mein ContentObserver aus, was für mich nicht nützlich ist, da es keine Inhaltsänderung in Contacts Provider gibt.

Ursache:

Scheint so, als ob LAST_TIME_CONTACTED oder etwas in ContactsContract.Contacts.CONTENT_URI Änderungen durchführt, wenn ein Anruf von einem Gerät getätigt wurde, dessen legitimes Aufwachen durch ContentObserver ausgelöst wurde.

Versucht:

%Vor%

Registrierte ContentObserver in OnCreate() von Activity

%Vor%

Versucht mit notifyForDescendents als false für registerContentObserver . Trotzdem löst es ContentObserver

aus

Fragen:

Wie kann man ContentObserver registrieren, was genau dann auslöst, wenn die Kontaktinformationen unter CRUD (Erstellen, Aktualisieren, Löschen) stehen außer Last_Time_Contacted oder seinen Nachkommen?

    
Vikalp Patel 21.05.2014, 12:35
quelle

2 Antworten

0

Da android.provider.ContactsContract content provider eine eigene Komplexität hat, macht es ContentObserver schwierig, nur auf contacts content change zu benachrichtigen, außer es ist LAST_TIME_CONTACTED field, da jeder andere dazu übergeht, dies zu sagen und so ist es auch.

Man muss seine eigene Logik entwickeln, ob contacts data aktualisiert wird oder nicht, wenn ContentObserver dies meldet.

Punkte, die die Logik berücksichtigen, ob contacts wirklich aktualisiert wird oder nicht.

  • Überprüfung auf der Grundlage der letzten Überprüfung. Hängt von der Anforderung ab.
  • Hinzufügen von ContentObserver in Service was STICKY ist, damit es dort sein kann, wenn Kontakte Änderungen erhalten.

Telefonbuchlogik synchronisieren: - Da ich Kontakte mit SQLite gepflegt habe, prüfe ich, ob das existiert oder nicht und ob ich Logik aufbauen soll.

%Vor%     
Vikalp Patel 01.07.2014, 12:32
quelle
5

Das grundlegende Problem hierbei ist, dass die Registrierung für ContactsContract.Contacts.CONTENT_URI nicht funktioniert, wie Sie vielleicht denken.

Der Grund, warum Sie Updates erhalten, auch wenn notifyForDescendents ist false ist, weil die Uri , die das Update auslöst, ... ContactsContract.Contacts.CONTENT_URI und nicht die Kontaktzeile ist, die gerade gewählt wird .

Der anstößige Code in der App "Kontakte" finden Sie unter GrepCode und es wurde ein Fehler auf Google-Code .

Um Ihre Frage zu beantworten, können Sie kein ContentObserver registrieren, das für bestimmte Felder eines Kontakts ausgelöst wird. Sie müssen etwas in Ihrer App haben, das die Berechnung verfolgt die Unterschiede, wenn onChange ausgelöst wird.

    
Dororo 25.06.2014 13:20
quelle