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 au cas où quelqu'un d'autre aurait le même problème.
Réponses:
Quelques autres conseils utiles pour déboguer des problèmes comme celui-ci.
Commencez par activer 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 une journalisation comme celle-ci:
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'aucun authentificateur n'est enregistré pour ce type de compte. Pour voir quels authentificateurs sont enregistrés, regardez le journal lors de l'installation du package:
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 d'authentificateur faisait référence à une ressource de chaîne qui n'a pas été résolue correctement lors de l'installation:
android:accountType="@string/account_type"
Les journaux ont montré
encountered new type: ServiceInfo: AuthenticatorDescription {type=@2131231194}, ...
Le remplacer par une chaîne normale (pas de ressource) a résolu le problème. Cela semble être spécifique à Android 2.1.
android:accountType="com.example.account"
la source
Tout d'abord, vérifiez la condition expliquée sur ce post :
[...] Si vous voyez une erreur dans
AccountManagerService
le formulairecaller 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'authentificateur, c'est ce qu'Android comprend comme étant l'authentificateur enregistré pour le type de compte. Le contrôle qui se produit dans leAccountManagerService
ressemble à ceci:private void checkCallingUidAgainstAuthenticator(Account account) { final int uid = Binder.getCallingUid(); if (account == null || !hasAuthenticatorUid(account.type, uid)) { String 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 leaccount.type
. C'est là que j'avais merdé. Je créais monAccount
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 String ACCOUNT_TYPE = "com.joelapenna.foursquared"; ... }
mais cette constante ne correspondait pas à la définition XML de mon authentificateur:
<account-authenticator xmlns:android="/web/20150729061818/http://schemas.android.com/apk/res/android" android:accountType="com.joelapenna.foursquared.account" ... />
Deuxièmement, si vous êtes comme moi et que vous souhaitez intégrer l'exemple dans votre application existante à des fins de test, assurez-vous d'utiliser la
Constants
classe qui fait partie de cet exemple et non duandroid.provider.SyncStateContract
package. Parce que les deux classes utilisent le même nom d'attributACCOUNT_TYPE
que celui utilisé lors de la création d'unAccount
objet.la source
Dans mon cas , le problème était tout simplement un décalage dans accountType déclaré en
res/xml/authenticator.xml
tantandroid:accountType="com.foo"
mais fait référence à tort comme"foo.com"
dans la création du compte:Account newAccount = new Account("dummyaccount", "foo.com");
Doh!
la source
Il y a quelques parties 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.putString("SERVER", "extra"); if (am.addAccountExplicitly(account, password, userdata)) { Bundle result = new Bundle(); result.putString(AccountManager.KEY_ACCOUNT_NAME, username); result.putString(AccountManager.KEY_ACCOUNT_TYPE, ACCESS_TYPE); setAccountAuthenticatorResult(result); }
Dans res / xml / authenticator.xml, vous devez définir vos données AccountAuthenticator (responsable de votre UID Authenticator). ACCESS_TYPE doit être la même chaîne que votre accountType défini dans ce xml!
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="de.buecherkiste" android:icon="@drawable/buecher" android:label="@string/app_name" android:smallIcon="@drawable/buecher" > </account-authenticator>
Enfin, vous devez définir votre service votre manifeste. N'oubliez pas les autorisations appropriées pour gérer vos comptes (AUTHENTICATE_ACCOUNTS / USE_CREDENTIALS / GET_ACCOUNTS / MANAGE_ACCOUNTS)
<service android:name=".AuthenticationService"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> </service>
la source
Mon erreur supposait que la méthode AccountManager getAccounts () renvoyait des comptes uniquement associés à mon contexte d'application. J'ai changé de
à
la source
La même erreur apparaîtra si vous mettez des valeurs incorrectes dans vos filtres d'intention dans votre manifeste. J'ai parcouru le didacticiel android-dev sur les adaptateurs de synchronisation et j'ai fini par définir une valeur fausse pour "intent-filter / action android: name" ainsi que "meta-data / android: name" pour syncadapter / accountauthenticator. Cette erreur a fait apparaître les mêmes erreurs dans les journaux.
Pour mémoire, les valeurs correctes sont: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}
la source
Assurez-vous que votre service XML pointe vers l'emplacement correct.
Par exemple, si le nom de votre module est
vous êtes un service android: le nom doit être
<service android:name=".module.auth.name-of-authenticator-service-class"...
dans AndriodManifest.xml
la source
Tout d'abord, jetez un autre 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 en tant qu'enfants de la
application
balise.<application ...> <activity ...(Activity)... </activity> <provider ...(CP service declaration)/> <service ...(Authentication service declaration)... </service> <service ...(Sync service declaration)... </service> </application>
la source
Pour moi, c'était une erreur très ridicule et très difficile à trouver.
Dans Authenticator.xml j'ai écrit
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"> 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="@string/app_name" />
au lieu de
<account-authenticator 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="@string/app_name" />
qui causait cette erreur. J'espère que cela aide quelqu'un!
la source
Dans mon cas, c'était les autorisations dans le fichier manifeste que j'avais
<uses-permission android:name="ANDROID.PERMISSION.GET_ACCOUNTS"/>
c'était tout en majuscules, quand je l'ai changé en
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
le problème était parti
la source
Aussi,
Vérifiez si vous traitez trop le AccountType comme une chaîne à l'ancienne.
J'ai la plupart de mon code emballé sous com.mycompany.android
J'ai utilisé avec succès le AccountType suivant : com.mycompany.android.ACCOUNT .
Maintenant, j'ai le désir d'utiliser plusieurs comptes, et lorsque j'essaie d'ajouter ".subType" à la fin de mon compte, cela échoue avec le
Cependant, si j'utilise "_subType" (trait de soulignement au lieu de point), cela fonctionne très bien.
Je suppose que quelque part sous le capot, Android essaie 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
la source
Si vous obtenez cette erreur et que toutes les solutions ci-dessus ne fonctionnent pas pour vous. De plus, vous supposez que vous avez suivi toute la procédure. Il se peut que le service d'authentification soit développé par un autre développeur, que vous souhaitez utiliser pour ajouter 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.
la source
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.
Ainsi, lorsque j'ai essayé de
accountManager.getAccounts()
rechercher cet e-mail, j'ai trouvé un compte avec le même e-mail MAIS avec un autre type de compte. Donc, lorsque j'essaye d'utiliser ce compte (google.com), j'obtiens cette erreur.Donc, la bonne façon de trouver un compte est:
public Account findAccount(String accountName) { for (Account account : accountManager.getAccounts()) if (TextUtils.equals(account.name, accountName) && TextUtils.equals(account.type, "myservice.com")) return account; return null; }
la source
accountManager.getAccountsByType("myservice.com")
place.Assurez-vous également que votre AccountAuthenticatorService dispose des filtres d'intention du prouveur;
c'est à dire.
<service android:name=".service.AccountAuthenticatorService"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> </service>
la source
Si vous obtenez cette exception sur les appareils Samsung, assurez-vous que vous n'utilisez pas le mode sans échec .
la source
Si les mêmes applications proviennent de magasins différents, par exemple Amazon App Store et Google Play Store, une exception de sécurité sera éventuellement lancée car la signature des applications serait différente dans ce cas.Si vous aviez prévu d'utiliser le même authentificateur à des fins uniques connectez-vous, l'une ou l'autre des applications planterait. j'avais rencontré ce problème une fois. Surtout 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 frappe ou d'autres réponses mentionnées ici, veuillez vérifier la signature des applications en cas de connexion unique.
la source
Pour ceux qui ont encore des problèmes: https://stackoverflow.com/a/37102317/4171098
la source