Ich habe die obige Ausnahme erhalten, als ich versucht habe, die Sample Sync Adapter-Anwendung zu implementieren. Ich habe zahlreiche Beiträge zu diesem Thema gesehen, aber keine zufriedenstellende Antwort.
Deshalb werde ich meine Lösung hier aufschreiben, falls jemand anderes in das gleiche Problem gerät.
Antworten:
Einige andere nützliche Tipps zum Debuggen solcher Probleme.
Aktivieren Sie zunächst die ausführliche Protokollierung für einige Tags:
Sie sehen die Protokollierung folgendermaßen:
Dies bedeutet, dass für diesen Kontotyp kein Authentifikator registriert ist. Um zu sehen, welche Authentifikatoren registriert sind, überprüfen Sie das Protokoll bei der Installation des Pakets:
Ich hatte das Problem, dass der XML-Deskriptor des Authentifikators auf eine Zeichenfolgenressource verwies, die während der Installation nicht ordnungsgemäß aufgelöst wurde:
Die Protokolle zeigten
Das Ersetzen durch eine normale Zeichenfolge (keine Ressource) löste das Problem. Dies scheint Android 2.1-spezifisch zu sein.
quelle
Überprüfen Sie zunächst die in diesem Beitrag erläuterte Bedingung :
[...] Wenn Sie einen Fehler
AccountManagerService
im Formular sehencaller uid XXXX is different than the authenticator's uid
, kann dieser etwas irreführend sein. Der 'Authentifikator' in dieser Nachricht ist nicht Ihre Authentifikatorklasse, sondern das, was Android als registrierten Authentifikator für den Kontotyp versteht. Die Überprüfung, die innerhalb der stattfindet,AccountManagerService
sieht folgendermaßen aus:Beachten Sie, dass
hasAuthenticatorUid()
dieaccount.type
. Hier hatte ich es vermasselt. Ich habe meineAccount
mit einem Typ erstellt, der durch eine Konstante angegeben wird:Diese Konstante stimmte jedoch nicht mit der XML-Definition für meinen Authentifikator überein:
Zweitens, wenn Sie wie ich sind und das Beispiel zum Testen in Ihre vorhandene App einbetten möchten, stellen Sie sicher, dass Sie eine
Constants
Klasse verwenden, die Teil dieses Beispiels ist und nicht unterandroid.provider.SyncStateContract
Paket. Weil beide Klassen denselben AttributnamenACCOUNT_TYPE
verwenden, der beim Erstellen einesAccount
Objekts verwendet wird.quelle
In meinem Fall war das Problem ganz einfach eine Nichtübereinstimmung in accountType, die
res/xml/authenticator.xml
als deklariert wurde ,android:accountType="com.foo"
aber wie"foo.com"
beim Erstellen des Kontos falsch referenziert wurde :Doh!
quelle
Es gibt nur wenige Teile, um ein benutzerdefiniertes Konto zu implementieren ...
Um AccountManager in Ihrer Aktivität aufzurufen, haben Sie so etwas bereits implementiert ...
In res / xml / authentulator.xml müssen Sie Ihre AccountAuthenticator-Daten definieren (verantwortlich für Ihre Authenticator-UID). ACCESS_TYPE muss dieselbe Zeichenfolge sein wie Ihr definierter accountType in dieser XML!
Schließlich müssen Sie Ihren Dienst als Ihr Manifest definieren. Bitte vergessen Sie nicht die relevanten Berechtigungen zum Verwalten Ihrer Konten (AUTHENTICATE_ACCOUNTS / USE_CREDENTIALS / GET_ACCOUNTS / MANAGE_ACCOUNTS).
quelle
Mein Fehler bestand darin, dass die AccountManager-Methode getAccounts () Konten zurückgab, die nur meinem Anwendungskontext zugeordnet waren. Ich habe mich verändert von
zu
quelle
Der gleiche Fehler wird angezeigt, wenn Sie in Ihren Absichtsfiltern in Ihrem Manifest falsche Werte einfügen. Ich habe das Android-Dev-Tutorial zu Synchronisationsadaptern durchgearbeitet und am Ende einen falschen Wert für "Intent-Filter / Action Android: Name" sowie "Metadaten / Android: Name" für Syncadapter / Accountauthenticator festgelegt. Dieser Fehler führte dazu, dass dieselben Fehler in den Protokollen angezeigt wurden.
Für den Datensatz lauten die korrekten Werte: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}
quelle
Stellen Sie sicher, dass Ihr Service-XML auf den richtigen Speicherort verweist.
Zum Beispiel, wenn Ihr Modulname ist
Sie sind Service Android: Name sollte sein
in AndriodManifest.xml
quelle
Schauen Sie sich zunächst Jan Berkels exzellenten Debugging-Rat an.
Schließlich müssen Sie auch überprüfen, ob Ihr Inhaltsanbieter sowie die Authentifizierungs- und Synchronisierungsdienste als untergeordnete
application
Elemente des Tags deklariert sind .quelle
Für mich war es ein sehr dummer Fehler und sehr schwer zu finden.
In authentulator.xml habe ich geschrieben
anstatt
was diesen Fehler verursachte. Hoffe das hilft jemandem!
quelle
In meinem Fall waren es Berechtigungen in der Manifestdatei, die ich hatte
Es waren alles Kappen, als ich es änderte
Problem war weg
quelle
Ebenfalls,
Überprüfen Sie, ob Sie den AccountType zu sehr wie einen einfachen alten String behandeln.
Ich habe den größten Teil meines Codes unter com.mycompany.android gepackt
Ich habe den folgenden AccountType mit Erfolg verwendet: com.mycompany.android.ACCOUNT .
Jetzt habe ich den Wunsch, mehrere Konten zu verwenden, und wenn ich versuche, ".SubType" am Ende meines Kontos anzuhängen, schlägt dies mit dem fehl
Wenn ich jedoch "_subType" (Unterstrich anstelle von Punkt) verwende, funktioniert dies einwandfrei.
Ich vermute, dass Android irgendwo unter der Haube versucht, com.mycompany.android.ACCOUNT als legalen Paketnamen zu behandeln, was es mit Sicherheit nicht ist.
Also nochmal:
BAD com.mycompany.android.ACCOUNT.subType
GUT com.mycompany.android.ACCOUNT_subType
quelle
Wenn Sie diesen Fehler erhalten und alle oben genannten Lösungen für Sie nicht funktionieren. Außerdem gehen Sie davon aus, dass Sie alle Verfahren befolgt haben. Möglicherweise wird der Authentifizierungsdienst von einem anderen Entwickler entwickelt, den Sie zum Hinzufügen von Konten verwenden möchten.
Sie können versuchen, Ihre Anwendung mit einem Release-Keystore zu signieren. Jetzt führen Sie die Anwendung aus. Ich nehme an, das sollte für dich funktionieren.
quelle
Hier ist eine andere mögliche Lösung.
Ich hatte diesen Fehler, als mein Benutzer in meiner App mit derselben E-Mail-Adresse wie sein Android-Google-Konto registriert wurde.
Als ich versuchte,
accountManager.getAccounts()
nach dieser E-Mail zu suchen, fand ich ein Konto mit derselben E-Mail, ABER mit einem anderen Kontotyp. Wenn ich versuche, dieses Konto (google.com) zu verwenden, wird dieser Fehler angezeigt.Der richtige Weg, um ein Konto zu finden, ist:
quelle
accountManager.getAccountsByType("myservice.com")
stattdessen anrufen .Stellen Sie außerdem sicher, dass Ihr AccountAuthenticatorService über die Filter für Prüferabsichten verfügt.
dh.
quelle
Wenn diese Ausnahme bei Samsung-Geräten auftritt, stellen Sie sicher, dass Sie den abgesicherten Modus nicht verwenden .
quelle
Wenn dieselben Apps aus einem anderen Store stammen, z. B. Amazon App Store und Google Play Store, wird möglicherweise eine Sicherheitsausnahme ausgelöst, da die Signatur der Apps in diesem Fall unterschiedlich ist. Wenn Sie geplant hätten, denselben Authentifikator für den Zweck eines einzelnen zu verwenden Melden Sie sich an, eine der Apps würde abstürzen. Ich war einmal auf dieses Problem gestoßen. Insbesondere der Amazon App Store würde seine Apps aus Sicherheitsgründen mit einer eigenen Signatur signieren.
Hinweis: Wenn hier kein Tippfehler oder andere Antworten vorliegen, überprüfen Sie bei einmaliger Anmeldung die Signatur der Apps.
quelle
Für diejenigen, die noch Erfahrung haben: https://stackoverflow.com/a/37102317/4171098
quelle