How to implement AccountManager in my application

I am trying to implement an account manager in my application to avoid having the user log in every time the application is opened.

Thus, basically I already have an authentication function in which the user can put his username and password and where we get the token from the server (at the moment authentication is basic). Now I want to add an AccountManager, but I really don’t understand which part will go there.

I need quite simple:

  • add account if i never logged in before
  • automatically if my account exists
  • If automatic authentication does not work, get a new token on the server

Here is my code:

AuthenticationActivity.java

public class AuthenticationActivity extends Activity { private EditText editTextUsername; private EditText editTextPassword; private Button buttonLogin; private ProgressBar spinner; private TextView error; private TextView register; private boolean accountRegistred; AccountManager accountManager; public static final String AUTHENTICATION = "authentication"; //action private ConnectionSuccessReceiver connectionSuccessReceiver = new ConnectionSuccessReceiver(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.authentification); accountManager = AccountManager.get(this); Account[] accounts = accountManager.getAccountsByType("login"); if (accounts.length > 0) { //If there is an account } else { accountRegistred = false; editTextUsername = (EditText) findViewById(R.id.editText_login); editTextUsername.setVisibility(View.VISIBLE); editTextPassword = (EditText) findViewById(R.id.editText_password); editTextPassword.setVisibility(View.VISIBLE); buttonLogin = (Button) findViewById(R.id.button_connection); buttonLogin.setVisibility(View.VISIBLE); error = (TextView) findViewById(R.id.textView_error); register = (TextView) findViewById(R.id.textView_register); register.setVisibility(View.VISIBLE); spinner = (ProgressBar) findViewById(R.id.progressBar); buttonLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Here we start the service which will reach the server Intent i = new Intent(getApplicationContext(), AuthenticationService.class); i.putExtra("username", editTextUsername.getText().toString()); i.putExtra("password", editTextPassword.getText().toString()); getApplication().startService(i); spinner.setVisibility(View.VISIBLE); error.setVisibility(View.INVISIBLE); } }); register.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(AuthenticationActivity.this, RegisterActivity.class)); } }); } registerReceiver(connectionSuccessReceiver, new IntentFilter(AUTHENTICATION)); } private class ConnectionSuccessReceiver extends BroadcastReceiver { //Called when the server returns success after authentication, we get the TOKEN here @Override public void onReceive(Context context, Intent intent) { if (intent.getStringExtra("STATE").equals("CONNECTED")) { Intent i = new Intent(AuthenticationActivity.this, MainActivity.class); i.putExtra("TOKEN", intent.getStringExtra("TOKEN")); startActivity(i); } else { spinner.setVisibility(View.INVISIBLE); error.setVisibility(View.VISIBLE); } finish(); } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(connectionSuccessReceiver); } } 

AuthenticatorService.java

 public class AuthenticatorService extends Service { /** * The implementation of the class |AccountAuthenticatorImpl|. * It is implemented as a singleton */ private static AccountAuthenticator accountAuthenticator = null; /** * The main constructor. */ public AuthenticatorService() { super(); } /** * The bind method of the service. * @param intent The intent used to invoke the service * @return The binder of the class which has implemented |AbstractAccountAuthenticator| */ @Override public IBinder onBind(Intent intent) { IBinder ret = null; if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT)) { ret = getAuthenticator().getIBinder(); } return ret; } /** * The method used to obtain the authenticator. It is implemented as a singleton * @return The implementation of the class |AbstractAccountAuthenticator| */ private AccountAuthenticator getAuthenticator() { if (AuthenticatorService.accountAuthenticator == null) { AuthenticatorService.accountAuthenticator = new AccountAuthenticator(this); } return AuthenticatorService.accountAuthenticator; } public class AccountAuthenticator extends AbstractAccountAuthenticator { private Context context; public AccountAuthenticator(Context context) { super(context); this.context = context; } @Override public Bundle editProperties(AccountAuthenticatorResponse accountAuthenticatorResponse, String s) { return null; } @Override public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException { Bundle reply = new Bundle(); Intent i = new Intent(context, AuthenticationActivity.class); i.setAction("com.readyo.app.authentication.addnewaccount"); i.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); i.putExtra("AuthTokenType", authTokenType); reply.putParcelable(AccountManager.KEY_INTENT, i); return reply; } @Override public Bundle confirmCredentials(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, Bundle bundle) throws NetworkErrorException { return null; } @Override public Bundle getAuthToken(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String s, Bundle bundle) throws NetworkErrorException { return null; } @Override public String getAuthTokenLabel(String s) { return null; } @Override public Bundle updateCredentials(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String s, Bundle bundle) throws NetworkErrorException { return null; } @Override public Bundle hasFeatures(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String[] strings) throws NetworkErrorException { return null; } } } 

I also have code to access the server via HTTP, but I'm not sure if this will be important here.

Thank you for your time.

+5
source share
1 answer

This is a bit late answer, but maybe this sample can help you: https://github.com/dawidgdanski/AccountAuthenticatorExample

I created it a while ago, but logging / logging logic might be useful

 add an account if I never logged in before: 
  • If the application flow requires the user to register in order to access the data, simply declare your LoginActivity to be the main one that will be displayed.

After verifying and verifying user credentials, call the AccountManager.addAccountExcplicitly () method.

  1. On the other hand, if you display some screens for anonymous users, then in the part of the application (settings or something else) where you provide the login / registration function, call AccountManager.addAccount (). This call activates your AccountAuthenticator, which processes your request in YourAccountAuthenticator.addAccount () and can display LoginActivity / SignUpActivity according to your needs.

Please keep in mind that you can also create an application-specific account from the system settings.

  log automatically if my account exists 

Well, I'm not sure if I understand your requirement correctly. After you register an account in the AccountManager metadata, it will be available after calling AccountManager.getAccountsByType ("my.account.type"). If you want to log in automatically, you must store your credentials somewhere, which is obviously at risk of confidential data leakage.

  if the auto authentication doesn't work get a new token on the server 

There is an AccountManager.invalidateAuthToken () method that deletes the currently saved authToken and calls another.

You can run the sample application, I think it can solve at least some of your problems, because it covers the following logic:

  • Login / registration
  • auth token invalid
  • display registered accounts
  • Exit

Greetings

+2
source

Source: https://habr.com/ru/post/1211012/


All Articles