Crea un autenticatore stub

La struttura dell'adattatore di sincronizzazione presuppone che l'adattatore di sincronizzazione trasferisca i dati tra lo spazio di archiviazione del dispositivo associati a uno spazio di archiviazione di account e server che richiede l'accesso tramite login. Per questo motivo, si aspetta che tu fornisca un componente chiamato autenticatore come parte della sincronizzazione dell'adattatore. Questo componente si collega agli account e al framework di autenticazione Android e Fornisce un'interfaccia standard per la gestione delle credenziali utente, come i dati di accesso.

Anche se la tua app non usa account, devi comunque fornire un componente di autenticazione. Se non utilizzi account o dati di accesso al server, le informazioni gestite dall'autenticatore sono ignorato, quindi puoi fornire un componente di autenticazione che contiene il metodo stub implementazioni. Devi anche fornire un valore Service associato che consente al framework dell'adattatore di sincronizzazione di chiamare i metodi dell'autenticatore.

Questa lezione mostra come definire tutte le parti di un autenticatore stub che devono soddisfare i requisiti del framework dell'adattatore di sincronizzazione. Se devi fornire un modello di autenticazione che gestisce gli account utente, leggi la documentazione di riferimento per AbstractAccountAuthenticator.

Aggiungi un componente di autenticazione stub

Per aggiungere un componente di autenticazione stub alla tua app, crea una classe che si estenda AbstractAccountAuthenticator e poi illustrare i metodi richiesti, restituendo null o generando un'eccezione.

Lo snippet seguente mostra un esempio di classe di autenticazione stub:

Kotlin

/*
 * Implement AbstractAccountAuthenticator and stub out all
 * of its methods
 */
class Authenticator(context: Context) // Simple constructor
    : AbstractAccountAuthenticator(context) {

    // Editing properties is not supported
    override fun editProperties(r: AccountAuthenticatorResponse, s: String): Bundle {
        throw UnsupportedOperationException()
    }

    // Don't add additional accounts
    @Throws(NetworkErrorException::class)
    override fun addAccount(
            r: AccountAuthenticatorResponse,
            s: String,
            s2: String,
            strings: Array<String>,
            bundle: Bundle
    ): Bundle?  = null

    // Ignore attempts to confirm credentials
    @Throws(NetworkErrorException::class)
    override fun confirmCredentials(
            r: AccountAuthenticatorResponse,
            account: Account,
            bundle: Bundle
    ): Bundle?  = null

    // Getting an authentication token is not supported
    @Throws(NetworkErrorException::class)
    override fun getAuthToken(
            r: AccountAuthenticatorResponse,
            account: Account,
            s: String,
            bundle: Bundle
    ): Bundle {
        throw UnsupportedOperationException()
    }

    // Getting a label for the auth token is not supported
    override fun getAuthTokenLabel(s: String): String {
        throw UnsupportedOperationException()
    }

    // Updating user credentials is not supported
    @Throws(NetworkErrorException::class)
    override fun updateCredentials(
            r: AccountAuthenticatorResponse,
            account: Account,
            s: String,
            bundle: Bundle
    ): Bundle {
        throw UnsupportedOperationException()
    }

    // Checking features for the account is not supported
    @Throws(NetworkErrorException::class)
    override fun hasFeatures(
            r: AccountAuthenticatorResponse,
            account: Account,
            strings: Array<String>
    ): Bundle {
        throw UnsupportedOperationException()
    }
}

Java

/*
 * Implement AbstractAccountAuthenticator and stub out all
 * of its methods
 */
public class Authenticator extends AbstractAccountAuthenticator {
    // Simple constructor
    public Authenticator(Context context) {
        super(context);
    }
    // Editing properties is not supported
    @Override
    public Bundle editProperties(
            AccountAuthenticatorResponse r, String s) {
        throw new UnsupportedOperationException();
    }
    // Don't add additional accounts
    @Override
    public Bundle addAccount(
            AccountAuthenticatorResponse r,
            String s,
            String s2,
            String[] strings,
            Bundle bundle) throws NetworkErrorException {
        return null;
    }
    // Ignore attempts to confirm credentials
    @Override
    public Bundle confirmCredentials(
            AccountAuthenticatorResponse r,
            Account account,
            Bundle bundle) throws NetworkErrorException {
        return null;
    }
    // Getting an authentication token is not supported
    @Override
    public Bundle getAuthToken(
            AccountAuthenticatorResponse r,
            Account account,
            String s,
            Bundle bundle) throws NetworkErrorException {
        throw new UnsupportedOperationException();
    }
    // Getting a label for the auth token is not supported
    @Override
    public String getAuthTokenLabel(String s) {
        throw new UnsupportedOperationException();
    }
    // Updating user credentials is not supported
    @Override
    public Bundle updateCredentials(
            AccountAuthenticatorResponse r,
            Account account,
            String s, Bundle bundle) throws NetworkErrorException {
        throw new UnsupportedOperationException();
    }
    // Checking features for the account is not supported
    @Override
    public Bundle hasFeatures(
        AccountAuthenticatorResponse r,
        Account account, String[] strings) throws NetworkErrorException {
        throw new UnsupportedOperationException();
    }
}

Associa l'autenticatore al framework

Affinché il framework dell'adattatore di sincronizzazione possa accedere al tuo autenticatore, devi creare un per questo. Questo servizio fornisce un oggetto binder Android che consente al framework per chiamare l'autenticatore e trasferire i dati tra quest'ultimo e il framework.

Il seguente snippet mostra come definire l'elemento Service associato:

Kotlin

/**
* A bound Service that instantiates the authenticator
* when started.
*/
class AuthenticatorService : Service() {

    // Instance field that stores the authenticator object
    private lateinit var mAuthenticator: Authenticator

    override fun onCreate() {
        // Create a new authenticator object
        mAuthenticator = Authenticator(getApplicationContext())
    }

    /*
     * When the system binds to this Service to make the RPC call
     * return the authenticator's IBinder.
     */
    override fun onBind(intent: Intent?): IBinder = mAuthenticator.iBinder
}

Java

/**
 * A bound Service that instantiates the authenticator
 * when started.
 */
public class AuthenticatorService extends Service {
    ...
    // Instance field that stores the authenticator object
    private Authenticator mAuthenticator;
    @Override
    public void onCreate() {
        // Create a new authenticator object
        mAuthenticator = new Authenticator(getApplicationContext());
    }
    /*
     * When the system binds to this Service to make the RPC call
     * return the authenticator's IBinder.
     */
    @Override
    public IBinder onBind(Intent intent) {
        return mAuthenticator.getIBinder();
    }
}

Aggiungi il file dei metadati dell'autenticatore

Per collegare il componente di autenticazione all'adattatore di sincronizzazione e ai framework dell'account, devi: fornire a questo framework metadati che descrivono il componente. Questi metadati dichiarano che hai creato per l'adattatore di sincronizzazione e dichiara gli elementi dell'interfaccia utente che il sistema visualizza se vuoi rendere visibile all'utente il tuo tipo di account. Dichiara metadati in un file XML archiviato nella directory /res/xml/ del progetto dell'app. Puoi assegnare qualsiasi nome al file, anche se in genere è chiamato authenticator.xml.

Questo file XML contiene un singolo elemento <account-authenticator> che presenta i seguenti attributi:

android:accountType
Il framework dell'adattatore di sincronizzazione richiede che ogni adattatore di sincronizzazione abbia un tipo di account, nel formato di un nome di dominio. Il framework utilizza il tipo di account come parte della per l'identificazione interna. Per i server che richiedono l'accesso, il tipo di account e viene inviato al server come parte delle credenziali di accesso.

Se il server non richiede l'accesso, devi comunque fornire un tipo di account. Per , utilizza un nome di dominio controllato da te. mentre il framework lo utilizza per gestire l'adattatore di sincronizzazione, il valore non viene inviato al server.

android:icon
Puntare a un elemento Drawable risorsa contenente un'icona. Se rendi visibile l'adattatore di sincronizzazione specificando il parametro attributo android:userVisible="true" in res/xml/syncadapter.xml, devi fornire la risorsa icona. Viene visualizzato nella sezione Account di nell'app Impostazioni del sistema.
android:smallIcon
Puntare a un elemento Drawable risorsa contenente una versione ridotta dell'icona. Questa risorsa può essere utilizzata al posto di android:icon nella sezione Account dell'app Impostazioni del sistema, in base alle dimensioni dello schermo.
android:label
Stringa localizzabile che identifica il tipo di account per gli utenti. Se crei l'adattatore di sincronizzazione visibile specificando l'attributo android:userVisible="true" in res/xml/syncadapter.xml, devi fornire questa stringa. Appare nella sezione Account dell'app Impostazioni del sistema, accanto all'icona che definisci per di autenticazione.

Lo snippet seguente mostra il file XML per l'autenticatore creato in precedenza:

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

Dichiara l'autenticatore nel file manifest

In un passaggio precedente, hai creato un elemento Service associato che collega l'autenticatore al framework dell'adattatore di sincronizzazione. Per identificare questo servizio per il sistema, dichiaralo nella tua app del file manifest aggiungendo il seguente <service> come elemento secondario di <application>:

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

La <intent-filter> configura un filtro che viene attivato dall'azione di intent android.accounts.AccountAuthenticator, inviata dal sistema per eseguire di autenticazione. Quando il filtro viene attivato, il sistema avvia AuthenticatorService, il Service associato che hai fornito per eseguire il wrapping dell'autenticatore.

La <meta-data> dichiara i metadati per l'autenticatore. La android:name collega i metadati al framework di autenticazione. La android:resource specifica il nome del file dei metadati dell'autenticatore creato in precedenza.

Oltre all'autenticatore, anche un adattatore di sincronizzazione richiede un fornitore di contenuti. Se la tua app non Se usi già un fornitore di contenuti, passa alla lezione successiva per imparare a creare contenuti stub. fornitore; In caso contrario, consulta la lezione Creazione di un adattatore di sincronizzazione.