2017-05-02 5 views
0

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"/> 

Répondre

1

Tout semble bien, il vous manque probablement la permission?

+1

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. –