84 votes

SecurityException : uid appelant XXXX est différent de l’authentificateur ' s uid

C'est pour l'enregistrement. J'ai reçu l'exception ci-dessus lors de la tentative de mettre en œuvre Échantillon de Synchronisation Adaptateur d'application. J'ai vu de nombreux posts à ce sujet mais aucune réponse satisfaisante. Donc, je vais noter mes solution ici au cas où quelqu'un d'autre obtient la même édition.

Tout d'abord, vérifier l'état expliqué sur ce post http://loganandandy.tumblr.com/post/613041897/caller-uid-is-different

Deuxièmement, si vous êtes comme moi et que vous souhaitez intégrer l'échantillon dans votre application existante pour les tests alors assurez-vous d'utiliser des Constantes de classe qui fait partie de cet exemple et de ne pas sous android.fournisseur de.SyncStateContract paquet. Parce que les deux classes d'utiliser le même nom d'attribut ACCOUNT_TYPE qui est utilisé lors de la création de l'objet de Compte.

HTH, Paul

54voto

Jan Berkel Points 1678

Quelques conseils utiles pour déboguer les problèmes de ce type.

D'abord 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 allez voir connexion 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'authenticator enregistrés pour ce type de compte. Pour voir les authentificateurs sont enregistrés regarder 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 l'authentificateur xml descripteur de visée à une ressource de chaîne qui ne s'est pas réglée correctement lors de l'installation:

android:accountType="@string/account_type"

Les journaux ont montré

encountered new type: ServiceInfo: AuthenticatorDescription {type=@2131231194}, ...

Remplacer normale avec une chaîne (pas de ressources) a résolu le problème. Cela semble être Android 2.1 spécifiques.

android:accountType="com.example.account"

43voto

Paul Points 804

@jcwenger - Merci pour remarquer que.

Réponse copié et collé ci-dessous.


J'ai reçu l'exception ci-dessus lors de la tentative de mettre en œuvre Échantillon de Synchronisation Adaptateur d'application. J'ai vu de nombreux posts à ce sujet mais aucune réponse satisfaisante. Donc, je vais noter mes solution ici au cas où quelqu'un d'autre obtient la même édition.

Tout d'abord, vérifier l'état expliqué sur ce post http://loganandandy.tumblr.com/post/613041897/caller-uid-is-different

Deuxièmement, si vous êtes comme moi et que vous souhaitez intégrer l'échantillon dans votre application existante pour les tests alors assurez-vous d'utiliser des Constantes de classe qui fait partie de cet exemple et de ne pas sous android.fournisseur de.SyncStateContract paquet. Parce que les deux classes d'utiliser le même nom d'attribut ACCOUNT_TYPE qui est utilisé lors de la création de l'objet de Compte.

25voto

Farrukh Najmi Points 416

Dans mon cas le problème était tout simplement une incompatibilité dans accountType déclaré dans res/xml/authenticator.xml comme android:accountType="com.foo « mais incorrectement référencés comme « foo.com » dans la création du compte :

Compte newAccount = nouveau compte ("dummyaccount", "foo.com") ;

Doh !

10voto

DocFoster Points 131

Il y a peu de pièces à mettre en œuvre compte personnalisé...

Pour appeler AccountManager dans votre Activité, quelque chose comme ce que vous avez déjà mis en œuvre...

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 votre AccountAuthenticator de données (responsable de votre Authentificateur UID). ACCESS_TYPE être la même chaîne que votre défini accountType 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 des autorisations requises pour la gestion de vos comptes (AUTHENTICATE_ACCOUNTS / USE_CREDENTIALS / GET_ACCOUNTS / MANAGE_ACCOUNTS)

<service android:name="AuthenticatationService">
    <intent-filter>
        <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data android:name="android.accounts.AccountAuthenticator"
        android:resource="@xml/authenticator" />
</service>

5voto

PLA Points 91

Mon erreur était en supposant que l’interlocuteur getAccounts() méthode retournée comptes associés uniquement à mon contexte d’application. J’ai changé de

À

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X