Recibí la excepción anterior al intentar implementar la aplicación Sample Sync Adapter. He visto numerosas publicaciones relacionadas con este problema, pero no he recibido una respuesta satisfactoria.
Así que anotaré mi solución aquí en caso de que alguien más tenga el mismo problema.
Respuestas:
Algunos otros consejos útiles para depurar problemas como este.
Primero habilite el registro detallado para algunas etiquetas:
$ 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
Verá un registro como este:
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
Lo que significa que no hay ningún autenticador registrado para este tipo de cuenta. Para ver qué autenticadores están registrados, observe el registro al instalar el paquete:
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
Tuve el problema de que el descriptor xml del autenticador se refería a un recurso de cadena que no se resolvió correctamente durante la instalación:
android:accountType="@string/account_type"
Los registros mostraban
encountered new type: ServiceInfo: AuthenticatorDescription {type=@2131231194}, ...
Reemplazarlo con una cadena normal (no recurso) resolvió el problema. Esto parece ser específico de Android 2.1.
android:accountType="com.example.account"
fuente
Primero, verifique la condición explicada en esta publicación :
[...] Si ve un error en
AccountManagerService
el formulariocaller uid XXXX is different than the authenticator's uid
, puede ser un poco engañoso. El 'autenticador' en ese mensaje no es su clase de autenticador, es lo que Android entiende como el autenticador registrado para el tipo de cuenta. El cheque que ocurre dentro del seAccountManagerService
ve así: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"); } }
Tenga en cuenta que
hasAuthenticatorUid()
toma elaccount.type
. Aquí es donde había metido la pata. Estaba creando miAccount
con un tipo especificado por una constante:class LoginTask { Account account = new Account(userId, AuthenticatorService.ACCOUNT_TYPE); ... } class AuthenticatorService extends Service { public static final String ACCOUNT_TYPE = "com.joelapenna.foursquared"; ... }
pero esta constante no coincide con la definición XML para mi autenticador:
<account-authenticator xmlns:android="/web/20150729061818/http://schemas.android.com/apk/res/android" android:accountType="com.joelapenna.foursquared.account" ... />
En segundo lugar, si es como yo y desea incrustar la muestra en su aplicación existente para probarla, asegúrese de usar la
Constants
clase que es parte de este ejemplo y no delandroid.provider.SyncStateContract
paquete. Porque ambas clases usan el mismo nombre de atributoACCOUNT_TYPE
que se usa al crear elAccount
objeto.fuente
En mi caso, el problema fue simplemente una falta de coincidencia en accountType declarado
res/xml/authenticator.xml
comoandroid:accountType="com.foo"
pero referenciado incorrectamente como"foo.com"
en la creación de la cuenta:Account newAccount = new Account("dummyaccount", "foo.com");
Doh!
fuente
Hay pocas partes para implementar una cuenta personalizada ...
Para invocar AccountManager en su Actividad, algo como eso que ya implementó ...
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); }
En res / xml / authenticator.xml tienes que definir tus datos de AccountAuthenticator (responsable de tu UID de Authenticator). ACCESS_TYPE tiene que ser la misma cadena que su accountType definido en este 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>
Finalmente tienes que definir tu servicio tu Manifiesto. No olvide los permisos relevantes para administrar sus cuentas (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>
fuente
Mi error fue asumir que el método AccountManager getAccounts () devolvió cuentas solo asociadas con el contexto de mi aplicación. Yo cambié de
a
fuente
El mismo error aparecerá si coloca valores incorrectos en sus filtros de intención en su manifiesto. Revisé el tutorial de android-dev sobre adaptadores de sincronización y terminé estableciendo un valor falso para "intent-filter / action android: name" así como "meta-data / android: name" para syncadapter / accountuthenticator. Este error provocó que aparecieran los mismos errores en los registros.
Para el registro, los valores correctos son: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}
fuente
Asegúrese de que el XML de su servicio apunte a la ubicación correcta.
Por ejemplo, si el nombre de su módulo es
eres servicio android: el nombre debe ser
<service android:name=".module.auth.name-of-authenticator-service-class"...
en AndriodManifest.xml
fuente
En primer lugar, eche un vistazo a los excelentes consejos de depuración de Jan Berkel.
Finalmente, otra cosa que debe verificar es que su proveedor de contenido y los servicios de autenticación y sincronización se declaren como hijos de la
application
etiqueta.<application ...> <activity ...(Activity)... </activity> <provider ...(CP service declaration)/> <service ...(Authentication service declaration)... </service> <service ...(Sync service declaration)... </service> </application>
fuente
Para mí fue un error muy tonto y fue muy difícil de encontrar.
En authenticator.xml escribí
<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" />
en vez 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" />
que estaba causando este error. ¡Espero que esto ayude a alguien!
fuente
En mi caso, tenía permisos en el archivo de manifiesto.
<uses-permission android:name="ANDROID.PERMISSION.GET_ACCOUNTS"/>
estaba todo en mayúsculas, cuando lo cambié a
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
el problema se fue
fuente
También,
Verifique si está tratando el AccountType demasiado como una Cadena vieja y simple.
Tengo la mayor parte de mi código empaquetado en com.mycompany.android
He estado usando el siguiente tipo de cuenta con éxito: com.mycompany.android.ACCOUNT .
Ahora tengo el deseo de usar varias cuentas, y cuando intento agregar ".subType" al final de mi cuenta, falla con el
Sin embargo, si utilizo "_subType" (subrayado en lugar de punto), funciona bien.
Supongo que en algún lugar bajo el capó, Android está tratando de tratar com.mycompany.android.ACCOUNT como un nombre de paquete legal, lo que ciertamente no es así.
Entonces, de nuevo:
BAD com.miempresa.android.ACCOUNT.subType
BUENO com.mycompany.android.ACCOUNT_subType
fuente
Si recibe este error y todas las soluciones anteriores no funcionan para usted. Además, asume que ha seguido todo el procedimiento. Es posible que exista la posibilidad de que el Servicio de autenticación sea desarrollado por algún otro desarrollador, que desee utilizar para Agregar cuentas.
Lo que puede intentar es intentar firmar su aplicación con un almacén de claves de lanzamiento. Ahora ejecuta la aplicación. Supongo que esto debería funcionar para ti.
fuente
Aquí hay otra posible solución.
Tuve este error cuando mi usuario se registró en mi aplicación con el mismo correo electrónico que su cuenta de Google en Android.
Entonces, cuando intenté
accountManager.getAccounts()
buscar este correo electrónico, encontré una cuenta con el mismo correo electrónico, PERO con otro tipo de cuenta. Entonces, cuando intento usar esta cuenta (google.com), aparece este error.Entonces, la forma correcta de encontrar una cuenta es:
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; }
fuente
accountManager.getAccountsByType("myservice.com")
.También asegúrese de que su AccountAuthenticatorService tenga los filtros de intención de prueba;
es decir.
<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>
fuente
Si obtiene esta excepción en dispositivos Samsung, asegúrese de que no está usando el modo seguro .
fuente
Si las mismas aplicaciones son de una tienda diferente, por ejemplo, la tienda de aplicaciones de Amazon y la tienda de Google Play, eventualmente se lanzará una excepción de seguridad, ya que la firma de las aplicaciones sería diferente en este caso. Si hubiera planeado usar el mismo autenticador para el propósito iniciar sesión, cualquiera de las aplicaciones fallaría. Me había encontrado con este problema una vez. Especialmente, la tienda de aplicaciones de Amazon firmaría sus aplicaciones con su propia firma por motivos de seguridad.
Nota: Si no hay ningún error tipográfico u otras respuestas mencionadas aquí, verifique la firma de las aplicaciones en caso de inicio de sesión único.
fuente
Para aquellos que aún tienen experiencia en el tema: https://stackoverflow.com/a/37102317/4171098
fuente