Question

Je suis en place un système de connexion pour une application Android utilisant le système de comptes intégrés (avec les API AccountManager).

Tout va bien et bien sur Android 2.2+, mais sur Android 2.1 ne comportant pas SyncAdapter provoque des redémarrages à l'écran du compte (voir http://code.google.com/p/android/issues/detail?id=5009 et AccountManager sans SyncAdapter )

Pour contourner cela, je mis en œuvre un bout SyncAdapter, qui retourne juste null de IBinder onBind(Intent intent), et a ajouté les choses pertinentes pour le manifeste. Cela résout le problème de redémarrage sur Android 2.1.

Cependant, il introduit un autre problème: après un compte est ajouté le système Android sera, quelque temps plus tard, lancer une synchronisation de votre compte. Bien qu'aucune des erreurs se produisent (en effet mon SyncAdapter ne fait rien, il n'a aucun moyen de provoquer des erreurs à moins que par le retour null), les séjours à l'icône de synchronisation coincés dans la barre de notification en haut. Cela se traduit par le système Android en maintenant une alarme verrouillage permanent , ce qui empêche l'appareil de couchage.

Le compte ne liste pas de composants synchronisables dans les paramètres du compte écran (sous l'en-tête «Données et synchronisation), et affiche toujours de synchronisation est désactivée» pour l'état de synchronisation dans la liste des comptes (même si l'icône de synchronisation est visible dans la barre de notifications). La désactivation de la synchronisation de compte ne supprime pas le problème. Retrait du compte arrête le problème.

Je suppose que je ne devrais pas être retournais nulle. Dois-je retourner une implémentation de base de ThreadedSyncAdapter? Toute aide pour un système de compte sans une synchronisation associée fonctionne correctement sur 2.1 et 2.2+ est très apprécié.

Était-ce utile?

La solution 2

Je sorte de résoudre mon problème. Vous ne pouvez pas revenir null de la méthode onBind de votre service - vous devez retourner le IBinder d'un AbstractThreadedSyncAdapter

Cela a pour effet indésirable d'ajouter une entrée dans la section des données et la synchronisation des paramètres de compte page, même si ma mise en œuvre de AbstractThreadedSyncAdapter ne fait rien; J'espérais éviter cela.

Pour résumer, afin d'utiliser le système de comptes dans Android, vous devez:

  • Mettre en œuvre un service qui a un IntentFilter pour android.content.SyncAdapter.
  • Ce service doit retourner le IBinder d'une implémentation AbstractThreadedSyncAdapter de ce méthode de la onBind.
  • Cela nécessite alors que vous avez un ContentProvider (peut-être une implémentation stub) qui est désigné sous le nom contentAuthority dans votre fichier XML SyncAdapter.
  • Ceci a bas côté que votre ContentProvider est répertorié sous l'en-tête et synchronisation des données sur la page de votre compte.

Autres conseils

Puisque c'est la seule question que je l'ai vu relié à ce problème, voici une> année réponse tardive. Je suis venu aussi à travers le problème de réveil verrouillage permanent en raison du système Android synchronisation mon compte personnalisé automatiquement.

La meilleure façon de gérer ce qui nécessite un code minimum et il est en fait si le compte jamais moins que les synchronisations spécifiquement appelé à la synchronisation dans le code:

ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);

Maintenant, cela exige que le moment où vous créez votre compte, vous appelez cette méthode statique. Alors que le premier paramètre étant le compte de régler ce paramètre pour le second paramètre étant l'autorité utilisée ContentProvider, et le troisième étant l'entier que lorsqu'il est réglé sur un nombre positif permet la synchronisation, lorsque 0 désactive la synchronisation et lorsqu'il est réglé sur quoi que ce soit d'autre en fait inconnu. L'autorisation d'utilisation peut être trouvé à l'intérieur de votre « sync_something.xml » sous l'attribut contentAuthority, qui est utilisé par votre SyncAdapter:

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts" 
android:accountType="com.myapp.account"/> <!-- This being your own account type-->

Le fichier XML ci-dessus est spécifié dans la partie de service de votre AndroidManifest.xml:

<service android:name=".DummySyncAdapterService"
        exported="true"
        android:process=":contacts">
        <intent-filter>
            <action android:name="android.content.SyncAdapter" />
        </intent-filter>
        <meta-data android:name="android.content.SyncAdapter" 
            android:resource="@xml/sync_something" /> <!--This points to your SyncAdapter XML-->
    </service>

Ceci est l'extrait de code que j'utilise pour créer mon compte personnalisé dans mon LoginActivity:

Account account = new Account("John Doe", "com.myapp.account");
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
AccountManager am = AccountManager.get(LoginActivity.this);
boolean accountCreated = am.addAccountExplicitly(account, "Password", null);
Bundle extras = LoginActivity.this.getIntent().getExtras();
if(extras != null){
    if (accountCreated) { 
        AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
        Bundle result = new Bundle();
        result.putString(AccountManager.KEY_ACCOUNT_NAME, "John Doe");
        result.putString(AccountManager.KEY_ACCOUNT_TYPE, "com.myapp.account");
        response.onResult(result);
    }
}

La grande partie est que lorsque les essais du système pour synchroniser le service, il vérifie si le service est synchronisable en premier lieu, si elle est définie sur false annule la synchronisation. Maintenant, vous ne devez pas créer votre propre ContentProvider ni ne vous ContentProvider obtenir montré sous et synchronisation des données. Cependant, vous avez besoin d'avoir une implémentation de bout de AbstractThreadedSyncAdapter qui retourne un IBinder à l'intérieur est la méthode onBind. Et last but not least, il fait en sorte que l'utilisateur ne peut pas activer la synchronisation ou utiliser la fonction « Sync Now "bouton pour ce compte, sauf si vous avez ajouté la fonctionnalité dans votre application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top