J’ai reçu l’exception ci-dessus en essayant d’implémenter l’application Sample Sync Adapter. J’ai vu de nombreux articles liés à ce problème mais aucune réponse satisfaisante.
Je vais donc noter ma solution ici si quelqu’un d’autre aborde le même problème.
Quelques autres conseils utiles pour déboguer des problèmes comme celui-ci.
Activez d’abord la journalisation détaillée pour certaines balises:
$ adb shell setprop log.tag.AccountManagerService VERBOSE $ adb shell setprop log.tag.Accounts VERBOSE $ adb shell setprop log.tag.Account VERBOSE $ adb shell setprop log.tag.PackageManager VERBOSE
Vous verrez apparaître comme ceci:
V/AccountManagerService: initiating bind to authenticator type com.example.account V/Accounts: there is no service connection for com.example.account V/Accounts: there is no authenticator for com.example.account, bailing out D/AccountManagerService: bind attempt failed for Session: expectLaunch true, connected false, stats (0/0/0), lifetime 0.002, addAccount, accountType com.example.account, requiredFeatures null
Ce qui signifie qu’il n’y a pas d’authentificateur enregistré pour ce type de compte. Pour voir quels authentificateurs sont enregistrés, regardez le journal lors de l’installation du paquet:
D/PackageManager: encountered new type: ServiceInfo: AuthenticatorDescription {type=com.example.account}, ComponentInfo{com.example/com.example.android.AuthenticatorService}, uid 10028 D/PackageManager: notifyListener: AuthenticatorDescription {type=com.example.account} is added
J’ai eu le problème que le descripteur XML de l’authentifiant se référait à une ressource de chaîne qui n’a pas été résolue correctement lors de l’installation:
android:accountType="@ssortingng/account_type"
Les journaux ont montré
encountered new type: ServiceInfo: AuthenticatorDescription {type=@2131231194}, ...
Le remplacer par une chaîne normale (pas une ressource) a résolu le problème. Ceci semble être spécifique à Android 2.1.
android:accountType="com.example.account"
Tout d’abord, vérifiez la condition expliquée sur ce post :
[…] Si vous voyez une erreur de la part de AccountManagerService
de l’ caller uid XXXX is different than the authenticator's uid
du formulaire, caller uid XXXX is different than the authenticator's uid
, cela peut être un peu trompeur. L’authentificateur dans ce message n’est pas votre classe d’authentification, mais c’est ce qu’Android comprend comme étant l’authentificateur enregistré pour le type de compte. La vérification qui se produit dans le AccountManagerService
ressemble à ceci:
private void checkCallingUidAgainstAuthenticator(Account account) { final int uid = Binder.getCallingUid(); if (account == null || !hasAuthenticatorUid(account.type, uid)) { Ssortingng msg = "caller uid " + uid + " is different than the authenticator's uid"; Log.w(TAG, msg); throw new SecurityException(msg); } if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "caller uid " + uid + " is the same as the authenticator's uid"); } }
Notez que hasAuthenticatorUid()
prend le type de account.type
. C’est là que j’ai foiré. Je créais mon Account
avec un type spécifié par une constante:
class LoginTask { Account account = new Account(userId, AuthenticatorService.ACCOUNT_TYPE); ... } class AuthenticatorService extends Service { public static final Ssortingng ACCOUNT_TYPE = "com.joelapenna.foursquared"; ... }
mais cette constante ne correspondait pas à la définition XML de mon authentificateur:
Deuxièmement, si vous êtes comme moi et souhaitez intégrer l’exemple dans votre application existante pour le tester, assurez-vous d’utiliser la classe Constants
qui fait partie de cet exemple et non le package android.provider.SyncStateContract
. Parce que les deux classes utilisent le même nom d’atsortingbut ACCOUNT_TYPE
que celui utilisé lors de la création de l’object Account
.
Dans mon cas, le problème était tout simplement une incohérence dans accountType déclaré dans res/xml/authenticator.xml
comme android:accountType="com.foo"
mais référencé incorrectement comme "foo.com"
lors de la création du compte:
Account newAccount = new Account("dummyaccount", "foo.com");
Doh!
Il y a peu de pièces pour implémenter un compte personnalisé …
Pour appeler AccountManager dans votre activité, quelque chose comme celui que vous avez déjà implémenté …
Account account = new Account(username, ACCESS_TYPE); AccountManager am = AccountManager.get(this); Bundle userdata = new Bundle(); userdata.putSsortingng("SERVER", "extra"); if (am.addAccountExplicitly(account, password, userdata)) { Bundle result = new Bundle(); result.putSsortingng(AccountManager.KEY_ACCOUNT_NAME, username); result.putSsortingng(AccountManager.KEY_ACCOUNT_TYPE, ACCESS_TYPE); setAccountAuthenticatorResult(result); }
Dans res / xml / authenticator.xml, vous devez définir vos données AccountAuthenticator (responsables de votre UID Authenticator). ACCESS_TYPE doit être la même chaîne que votre accountType défini dans ce fichier XML!
Enfin, vous devez définir votre service votre manifeste. N’oubliez pas les permissions nécessaires pour gérer vos comptes (AUTHENTICATE_ACCOUNTS / USE_CREDENTIALS / GET_ACCOUNTS / MANAGE_ACCOUNTS)
Mon erreur était de supposer que la méthode getManager () de AccountManager renvoyait des comptes uniquement associés à mon contexte d’application. J’ai changé de
AccountManager accountManager = AccountManager.get(context); Account[] accounts = accountManager.getAccounts();
à
AccountManager accountManager = AccountManager.get(context); Account[] accounts = accountManager.getAccountsByType(Constants.ACCOUNT_TYPE);
La même erreur apparaîtra si vous mettez des valeurs incorrectes dans vos filtres d’intention dans votre manifeste. J’ai parcouru le tutoriel sur Android-dev sur les adaptateurs de synchronisation et j’ai fini par définir une valeur erronée pour “intent-filter / action android: name” ainsi que “meta-data / android: name” pour syncadapter / accountauthenticator. Cette erreur a provoqué l’apparition des mêmes erreurs dans les journaux.
Pour l’enregistrement, les valeurs correctes sont les suivantes: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}
Assurez-vous que votre service XML pointe vers le bon emplacement.
Par exemple, si votre nom de module est
com.example.module.auth
vous êtes android de service: le nom devrait être
dans AndriodManifest.xml
Tout d’abord, jetez un coup d’œil aux excellents conseils de débogage de Jan Berkel.
Enfin, une autre chose à vérifier est que votre fournisseur de contenu et les services d’authentification et de synchronisation sont déclarés comme enfants de la balise d’ application
.
Pour moi, c’était une erreur très stupide et très difficile à trouver.
Dans authenticator.xml j’ai écrit
xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="com.myapp" android:icon="@drawable/ic_launcher" android:smallIcon="@drawable/ic_launcher" android:label="@ssortingng/app_name" />
au lieu de
qui causait cette erreur. J’espère que cela aide quelqu’un!
Dans mon cas, il s’agissait d’permissions dans un fichier manifeste que j’avais
c’était tous les chapeaux, quand je l’ai changé pour
le problème avait disparu
Aussi,
Vérifiez si vous traitez trop le type de compte comme un ancien type de chaîne.
J’ai la plupart de mon code emballé sous com.mycompany.android
J’ai utilisé le type de compte suivant avec succès: com.mycompany.android.ACCOUNT .
Maintenant, je souhaite utiliser plusieurs comptes, et lorsque je tente d’append “.subType” à la fin de mon compte, cela échoue avec
l’appelant ux xxxxx est différent de l’identifiant de l’authentificateur
Cependant, si j’utilise “_subType” (trait de soulignement au lieu de point), cela fonctionne bien.
Je suppose que, quelque part sous Android, Android tente de traiter com.mycompany.android.ACCOUNT comme un nom de package légal, ce qui n’est certainement pas le cas.
Donc encore:
BAD com.mycompany.android.ACCOUNT.subType
GOOD com.mycompany.android.ACCOUNT_subType
Si vous obtenez cette erreur et que toutes les solutions ci-dessus ne fonctionnent pas pour vous. En outre, vous supposez que vous avez suivi toutes les procédures. Il se peut que le service d’authentification soit développé par un autre développeur que vous souhaitez utiliser pour append des comptes.
Vous pouvez essayer de signer votre application avec un fichier de clés de version. Maintenant vous exécutez l’application. Je suppose que cela devrait fonctionner pour vous.
Voici une autre solution possible.
J’ai eu cette erreur lorsque mon utilisateur a été enregistré dans mon application avec le même e-mail que son compte Google Android.
Donc, quand j’ai essayé accountManager.getAccounts()
et que j’ai cherché cet e-mail, j’ai trouvé un compte avec le même e-mail MAIS avec un autre type de compte. Donc, en essayant d’utiliser ce compte (google.com), j’obtiens cette erreur.
Donc, la bonne façon de trouver un compte est la suivante:
public Account findAccount(Ssortingng accountName) { for (Account account : accountManager.getAccounts()) if (TextUtils.equals(account.name, accountName) && TextUtils.equals(account.type, "myservice.com")) return account; return null; }
Assurez-vous également que votre compte AccountAuthenticatorService possède les filtres d’intention du prouveur;
c’est à dire.
Si vous obtenez cette exception sur les appareils Samsung, assurez-vous que vous n’utilisez pas le mode sans échec .
Si les mêmes applications proviennent d’un magasin différent, par exemple amazon app store et google play store, une exception de sécurité sera éventuellement émise, car la signature des applications serait différente dans ce cas. Si vous aviez prévu d’utiliser le même authentificateur connectez-vous, l’une ou l’autre de l’application tomberait en panne. J’avais rencontré ce problème une fois. En particulier, amazon app store signerait ses applications avec sa propre signature à des fins de sécurité.
Remarque: S’il n’y a pas d’erreur de faute de frappe ou d’autres réponses mentionnées ici, veuillez vérifier la signature des applications en cas de connexion unique.
Pour ceux qui éprouvent encore des difficultés: https://stackoverflow.com/a/37102317/4171098
Dans mon cas, j’ai défini accidentellement AuthenticatorService dans le manifeste en dehors des balises
. Déplacer la déclaration dans
résolu le problème. L’espoir aidera quelqu’un.