2012-01-12 15 views
9

Implementé mi autenticador de AccountManager, el servicio y toda la oferta, y todo parece funcionar bien.No permitir múltiples cuentas en AccountManager

Sin embargo, hay un pequeño problema: solo quiero que exista una sola cuenta para mi aplicación en el administrador de la cuenta, pero no puedo encontrar una manera de limitar esto.

¿Mi única solución es realizar una búsqueda y eliminar las cuentas actuales (por tipo) antes de agregar la nueva cuenta?

Mi código actual:

private void removeAccounts() 
{ 
    Account [] accounts = mAcctMgr.getAccountsByType (mAccountType); 

    if (accounts.length == 0) return; 

    final Handler handler = new Handler(); 

    AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>() 
    { 
     @Override 
     public void run(AccountManagerFuture<Boolean> arg0) 
     { 
      // nada 
     } 
    }; 

    for (Account a : accounts) { 
     mAcctMgr.removeAccount (a, callback, handler); 
    } 
} 

no lo hago por cualquier medio llaman a esto una solución elegante, pero por el momento parece ser el único que funciona.

+0

Lo que habla en contra de buscar en las cuentas y eliminar o anular si ya existe –

+3

Porque si hay una manera de limitar las cuentas a una sola, entonces esa sería obviamente la forma * adecuada * de hacerlo. ¿Has hecho esto? No puedo anular una cuenta, una vez que carga una cuenta, los campos son definitivos. La eliminación es asincrónica y utiliza una interfaz que no está documentada en absoluto. Dejar el método de interfaz en blanco parece funcionar, pero por razones obvias no quiero hacer eso. – copolii

+0

Ya utilicé AccountManager y no conozco otra forma de limitar las cuentas a una sola. Creo que deberías avisar al usuario con un cuadro de diálogo si quiere eliminar el anterior y luego dejarlo crear uno nuevo. No creo que haya una manera más elegante de hacer eso. –

Respuesta

5

En la función addAccount de su clase Authenticator (la que extiende AbstractAccountAuthenticator), primero verifique si existe una cuenta. Si ya existe una cuenta, simplemente devuelva nulo (y tal vez muestre un mensaje de brindis). Si no hay cuentas, simplemente devuelva el paquete como lo hacía antes.

 if(AccountHelper.accountExists(mContext)) { 
     mHandler.post(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(mContext, "Only one account allowed", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     return null; 
    } 
+4

Volviendo nulo en addAccount: "null si el resultado debe ser devuelto a través de la respuesta". Puede disparar el mensaje Toast, pero debe devolver un Bundle con: "KEY_ERROR_CODE y KEY_ERROR_MESSAGE para indicar un error". [AbstractAccountAuthenticator] (http://developer.android.com/reference/android/accounts/AbstractAccountAuthenticator.html) – SysHex

+0

¿Cómo puedo verificar si existe una cuenta? –

12

por la javadocs for addAccount(), si se produce un error al crear la cuenta, debe devolver un paquete que contiene los parámetros KEY_ERROR_CODE y KEY_ERROR_MESSAGE,

if (accountExists) { 
     final Bundle result = new Bundle(); 
     result.putInt(AccountManager.KEY_ERROR_CODE, ERROR_CODE_ONE_ACCOUNT_ALLOWED); 
     result.putString(AccountManager.KEY_ERROR_MESSAGE, context.getString(R.string.one_account_allowed)); 

     handler.post(new Runnable() { 

      @Override 
      public void run() { 
       RepeatSafeToast.show(context, R.string.one_account_allowed); 
      } 
     }); 
     return result; 
    } 

Volviendo nullno significar el fracaso, significa que el resultado se comunicará a través del parámetro de respuesta al método addAccount().

+1

Pero, no muestra el 'Toast' – Manjunath

+0

¿Cómo diablos puedo resolver para accountExists? No sé cómo detectar si existe un Tipo de cuenta particular en el Administrador de cuentas de Android. –

0

Ese enlace dice cómo cambiar el nombre de una cuenta, que puede ser equivalente a su solicitud renameAccount on developer.Android. Sin embargo, solo está disponible desde el nivel 21 de la API. Si alguien consigue una forma de hacerlo para dispositivos anteriores, ¡por favor comparte!

Cuestiones relacionadas