IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Permet obtenir els comptes del sistema. Pot ser útil per exemple en pàgines de login per proposar a l'usuari un username/email que ja estigui donat d'alta al sistema.

Permisos

<uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission> 
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"></uses-permission>

Per afegir comptes:

   <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
   <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
   <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>

Si hi ha una part de connexió a Internet i autenticació també necessitareu:

   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>

Registrar/definir servei Android al fitxer Manifest

S'ha de registrar un servei android al fitxer manifest:

 <service android:name=".UdinicAuthenticatorService">
            <intent-filter>
                <action android:name="android.accounts.AccountAuthenticator" />
            </intent-filter>
            <meta-data android:name="android.accounts.AccountAuthenticator"
                       android:resource="@xml/authenticator" />
        </service>

On @xml/authenticator és un Recurs Android amb el següent contingut (carpeta res/xml fitxer authenticator.xml)

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
                       android:accountType="com.udinic.auth_example"
                       android:icon="@drawable/ic_udinic"
                       android:smallIcon="@drawable/ic_udinic"
                       android:label="@string/app_name"
                       android:accountPreferences="@xml/prefs"/>

Que com podeu veure utilitza un launcher icon (drawable) que és que apareixerà al gestor de compte d'Android al gestionar un compte del vostre tipus i el nom de l'aplicació (app_name) i un recurs XML extra anomenat prefs amb:

 <?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="Udinic Preferences" />
    <CheckBoxPreference android:title="Use debug server"
                        android:key="isDebug"
                        android:summary="Connecting to a debug server instead of prod server"/>
    <SwitchPreference android:title="Debug Logs" android:key="logsVerbose" android:summary="Show debug logs on LogCat"/>
</PreferenceScreen>


On el servei serà quelcom similar a:

package org.acacha.ebre_escool.ebre_escool_app;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class EbreEscoolAuthenticatorService extends Service {
    @Override
    public IBinder onBind(Intent intent) {

        EbreEscoolAuthenticator authenticator = new EbreEscoolAuthenticator(this);
        return authenticator.getIBinder();
    }
}

On EbreEscoolAuthenticator és una classe que hereta de AbstractAccountAuthenticator

Package

El paquet amb totes les classes relacionades amb AccountManager és:

android.accounts

Classes

AbstractAccountAuthenticator

Cal crear un Authenticator per a la vostra aplicació heretant AbstractAccountAuthenticator (android.accounts.AbstractAccountAuthenticator). Un exemple:

public class EbreEscoolAuthenticator extends AbstractAccountAuthenticator

Els mètodes més importants que haureu d'implementar són:

  • addAccount: Com afegir un compte de la vostra app a AccountManager
  • updateCredentials: Com actualitzar les credencials d'un compte ja existent a AccountManager
  • getAuthToken: El mètode que "substituirà" el Login de la vostra aplicació en les execucions que no siguin la primera execució o millor dit quan l'usuari ja tingui un compte de la vostre app configurat correctament al vostre AccountManager.
  • ...

Consulteu l'apartat Registrar/definir servei Android al fitxer Manifest per veure com registreu aquest servei al sistema operatiu. Un cop aconseguit accés de root es pot executar:

$ adb shell
$ su
# cd data/system
# ls -la

Aquí hi ha els fitxers amb les dades incloses les paraules de pas. Compte doncs si us roben el mòbil!

Recursos:

AccountManager

Configurar comptes al emulador

Com funciona?

TODO 

Diagrama:

https://udinic.files.wordpress.com/2013/04/oauth_dance1.png?w=627

First time logging-in

  • The app asks the AccountManager for an auth-token.
  • The AccountManager asks the relevant AccountAuthenticator if it has a token for us.
  • Since it has none (there’s no logged-in user), it show us a AccountAuthenticatorActivity that will allow the user to log-in.
  • The user logs-in and auth-token is returned from the server.
  • The auth-token is stored for future use in the AccountManager.
  • The app gets the auth-token it requested

In case the user has already logged-in, we would get the auth-token back already on the second step. You can read more about authenticating using OAuth2

Exemple

Obtenir els comptes del sistema

Vegeu el gist:

https://gist.github.com/acacha/af000dd6cead9c3b1e1d

Udinic. Exemple complet ús AccountManager

Explicació (blog)

https://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/

Codi font:

https://github.com/Udinic/AccountAuthenticator

Aplicació exemple:

https://play.google.com/store/apps/details?id=com.udinic.accounts_example

Com utilitzar amb fragments

Fixeu-vos que el codi exemple utilitza AccountAuthenticatorActivity com a pare de l'activitat principal per a treballar amb AccountManager. Es pot però treballar amb una altre activitat pare (per exemple FragmentActivity per treballar amb Fragments) i no utilitzar AccountAuthenticatorActivity sempre i quan implementem el mètodes de AccountAuthenticatorActivity a la nostre activitat. El codi font està a:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/accounts/AccountAuthenticatorActivity.java

Recursos

Troubleshooting. Resol·lució de problemes

Depurar

Activeu el LOG de AccountManagerService, Accounts, Account i PackageManager:

$ 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

Vegeu també

Enllaços externs