2012-04-27 7 views
5

Ho qualche dubbio sull'architettura Android quando si tratta di autenticazione.Capire gli intenti nell'autenticazione Android

Supponiamo che chiami AccountManager.getAuthToken per un account particolare che devo autenticare. Diciamo che l'autenticazione fallisce a causa della password errata. Il contratto AbstractAccountAuthenticator richiede all'autenticatore di restituire un Bundle con Activity che gestisce l'immissione di nome utente/password tramite KEY_INTENT.

La mia domanda è: chi deve mostrare l'interfaccia utente? Android rileva automaticamente che è presente KEY_INTENT ed esegue l'interfaccia utente o il mio codice deve essere startActivity con l'intenzione incorporata nella risposta di AccountManager? Lo stesso vale per AccountManager.addAccount che raggruppa il risultato attraverso un'interfaccia Future.

Dove posso trovare alcuni tutorial su questi argomenti?

Grazie

risposta

0

Il sistema non mostra automaticamente l'attività quando è presente KEY_INTENT. Sta a te iniziare questa attività.

Ecco alcuni esempi di codice:

private AccountManagerCallback<Bundle> mAccountManagerCallback = new AccountManagerCallback<Bundle>() { 

    public void run(AccountManagerFuture<Bundle> future) { 

     Bundle bundle; 
     try { 

      bundle = future.getResult(); 
      //if an intent was sent, start the required activity 
      if (bundle.containsKey(AccountManager.KEY_INTENT)) { 
       Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); 

       //clear the new task flag just in case, since a result is expected 
       int flags = intent.getFlags(); 
       flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK; 
       intent.setFlags(flags); 

       startActivityForResult(intent, REQUEST_CODE_AUTH); 

     } else { 
      //otherwise, just get the credentials 
      if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) { 
        String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN); 
        String userMail  = bundle.getString(AccountManager.KEY_ACCOUNT_NAME); 
        //use the credentials 
      } 
     } 
     } 
     catch(...) { 
     ... 
     //handle errors, maybe retry your getAuthToken() call 
     } 
    } 
} 

Spero che questo è quello che stavi cercando, ma nel caso in cui non ho capito la tua domanda correttamente, si prega di chiarire.

Cheers!

+0

E se non ** sto ** utilizzando una richiamata? Ho fatto la domanda perché voglio sapere se e cosa deve fare l'interfaccia utente nel caso in cui l'autenticatore restituisca un Intent. Il sistema lo mostra automaticamente o devo implementare il codice nel chiamante? Sto iniziando a pensare che solo il sistema può eseguire l'intento perché deve essere eseguito con lo stesso UID del creatore dell'account. Sono davvero confuso –

+0

[Aggiungi] Immagino che la tua prima frase * sia * la risposta: ogni chiamante deve implementare tutta la logica ... –

Problemi correlati