La méthode OnChange de ContactObserver n'appelle pas sauf si j'exécute l'application une deuxième fois. La première exécution qui fait que l'installation semble ne fait pas que l'observateur de registre même onCreate est appelé du service.ContentObserver n'appelle pas
En deuxième exécution, il fonctionne parfaitement. Vous pouvez voir le code ci-dessous.
public final class ContactSync extends Service {
private ContactObserver mObserver;
public ContactSync() {
mObserver = new ContactObserver();
}
@Override
public void onCreate() {
super.onCreate();
getContentResolver().registerContentObserver(ContactsContract.ProfileSyncState.CONTENT_URI, true, mObserver);
Logger.i("Sync service is ready");
}
@Override
public void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(mObserver);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
private void lookup() {
RealmResults<Contact> all = Realm
.getDefaultInstance()
.where(Contact.class)
.findAll();
for (Contact proxy : all) {
Contact concrete = Realm
.getDefaultInstance()
.copyFromRealm(proxy);
Contact raw = ContactResolver
.from(getApplicationContext())
.setUri(concrete.data())
.setPosition(concrete.mPosition)
.query();
if (raw == null) {
delete(proxy);
} else {
update(raw);
}
}
publish();
}
private void publish() {
LocalBroadcastManager
.getInstance(getApplicationContext())
.sendBroadcastSync(new Intent(ContactEdge.PublishEvent.EVENT_PUBLISH));
Logger.i("Published contacts");
}
private void update(@NonNull final Contact contact) {
Realm
.getDefaultInstance()
.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(contact);
Logger.json(contact);
}
});
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
ShortcutInfo shortcut = new ShortcutInfo.Builder(
getApplicationContext(), contact.getId())
.setShortLabel(contact.getShortLabel())
.setLongLabel(contact.getLongLabel())
.setIcon(contact.getIcon(getApplicationContext()))
.setIntent(contact.getIntent())
.build();
ShortcutManager manager = getSystemService(ShortcutManager.class);
manager.addDynamicShortcuts(Collections.singletonList(shortcut));
}
Logger.i("Updated contact");
}
private void delete(@NonNull final Contact contact) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) {
ShortcutManager manager = getSystemService(ShortcutManager.class);
manager.removeDynamicShortcuts(Collections.singletonList(contact.getId()));
}
Realm
.getDefaultInstance()
.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
contact.deleteFromRealm();
}
});
Logger.i("Deleted contact");
}
final class ContactObserver extends ContentObserver {
ContactObserver() {
super(new Handler(Looper.getMainLooper()));
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
lookup();
}
}
Ma classe d'application:
public final class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
Realm.init(this);
startContactSync();
}
private void startContactSync() {
Intent service = new Intent(this, ContactSync.class);
startService(service);
}
et l'élément XML dans l'élément d'application du fichier Manifest.
<service
android:name=".ui.edge.contact.ContactSync"
android:enabled="true"
android:exported="false"/>
Merci pour le point. Thats explique pourquoi cela ne fonctionne pas la première fois. Parce que la permission n'est pas encore accordée. –