# Accounts and AccountManager

# Understanding custom accounts/authentication

The following example is high level coverage of the key concepts and basic skeletal setup:-

  1. Collects credentials from the user (Usually from a login screen you've created)
  2. Authenticates the credentials with the server (stores custom authentication)
  3. Stores the credentials on the device

Extend an AbstractAccountAuthenticator (Primarily used to retrieve authentication & re-authenticate them)

public class AccountAuthenticator extends AbstractAccountAuthenticator {

  public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
      String authTokenType, String[] requiredFeatures, Bundle options) {
    //intent to start the login activity

  public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) {

  public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {

  public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType,
      Bundle options) throws NetworkErrorException {
    //retrieve authentication tokens from account manager storage or custom storage or re-authenticate old tokens and return new ones

  public String getAuthTokenLabel(String authTokenType) {

  public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features)
      throws NetworkErrorException {
    //check whether the account supports certain features

  public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType,
      Bundle options) {
    //when the user's session has expired or requires their previously available credentials to be updated, here is the function to do it.

Create a service (Account Manager framework connects to the extended AbstractAccountAuthenticator through the service interface)

public class AuthenticatorService extends Service {

    private AccountAuthenticator authenticator;

    public void onCreate(){
        authenticator = new AccountAuthenticator(this);

    public IBinder onBind(Intent intent) {
        return authenticator.getIBinder();

Authenticator XML configuration (The account manager framework requires. This is what you'll see inside Settings -> Accounts in Android)

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
    android:smallIcon="@drawable/app_icon" />

Changes to the AndroidManifest.xml (Bring all the above concepts together to make it usable programmatically through the AccountManager)

            <action android:name="android.accounts.AccountAuthenticator"/>

The next example will contain how to make use of this setup.