Das Framework des Sync Adapters geht davon aus, dass Ihr Synchronisierungsadapter Daten zwischen Gerätespeichern überträgt. die mit einem Konto und einem Serverspeicher verknüpft sind, für den eine Anmeldung erforderlich ist. Aus diesem Grund erwartet Sie, dass Sie eine Komponente, die als Authenticator bezeichnet wird, im Rahmen der Synchronisierung bereitstellen. Adapter. Diese Komponente wird mit dem Android-Framework und der Authentifizierung verbunden. stellt eine Standardoberfläche für die Verarbeitung von Nutzeranmeldedaten wie Anmeldedaten zur Verfügung.
Auch wenn Ihre App keine Konten verwendet, müssen Sie eine Authentifizierungskomponente bereitstellen.
Wenn Sie weder Konten noch Server-Login verwenden, werden die Informationen, die vom Authenticator verarbeitet werden,
ignoriert werden, sodass Sie eine Authenticator-Komponente bereitstellen können, die die Stub-Methode enthält
Implementierungen. Sie müssen auch eine gebundene Service
angeben, die
ermöglicht dem Synchronisierungsadapter-Framework, die Methoden des Authenticators aufzurufen.
In dieser Lektion erfahren Sie, wie Sie
alle Bestandteile eines Stub-Authentizators definieren,
die Anforderungen des Frameworks für den Synchronisierungsadapter erfüllen. Wenn Sie einen echten
Authenticator, der Nutzerkonten verarbeitet, finden Sie in der Referenzdokumentation für
AbstractAccountAuthenticator
Stub-Authentifikatorkomponente hinzufügen
Um Ihrer App eine Stub-Authentifikatorkomponente hinzuzufügen, erstellen Sie eine Klasse, die die
AbstractAccountAuthenticator
und führen Sie dann einen Stub-out für die erforderlichen Methoden durch.
entweder durch Rückgabe von null
oder durch Auslösen einer Ausnahme.
Das folgende Snippet zeigt ein Beispiel für eine Stub-Authentifikatorklasse:
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(); } }
Binden Sie den Authenticator an das Framework.
Damit das Synchronisierungsadapter-Framework auf Ihren Authenticator zugreifen kann, müssen Sie eine gebundene Service für sie. Dieser Dienst stellt ein Android-Binderobjekt bereit, das das Framework ermöglicht. um Ihren Authenticator aufzurufen und Daten zwischen dem Authenticator und dem Framework zu übergeben.
Das folgende Snippet zeigt, wie die gebundene Service
definiert wird:
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(); } }
Authenticator-Metadatendatei hinzufügen
Um Ihre Authentifizierungskomponente mit dem Synchronisierungsadapter und den Konto-Frameworks zu verbinden, müssen Sie
Framework mit Metadaten bereitstellen, die die Komponente beschreiben. Diese Metadaten deklariert die
Kontotyp, den Sie für den Synchronisierungsadapter erstellt haben, und deklariert Elemente der Benutzeroberfläche
das das System anzeigt, wenn Sie Ihren Kontotyp für den Nutzer sichtbar machen möchten. Deklarieren
Metadaten in einer XML-Datei, die im Verzeichnis /res/xml/
Ihres Anwendungsprojekts gespeichert ist.
Sie können der Datei einen beliebigen Namen geben, obwohl sie normalerweise als authenticator.xml
bezeichnet wird.
Diese XML-Datei enthält ein einzelnes Element <account-authenticator>
, das
verfügt über die folgenden Attribute:
-
android:accountType
-
Für das Framework des Synchronisierungsadapters muss jeder Synchronisierungsadapter einen Kontotyp im Format
eines Domainnamens. Das Framework verwendet den Kontotyp als Teil des Synchronisierungsadapters
der internen Identifizierung. Bei Servern, für die eine Anmeldung erforderlich ist, muss der Kontotyp zusammen mit einem
Nutzerkonto wird als Teil der Anmeldedaten an den Server gesendet.
Auch wenn für Ihren Server keine Anmeldung erforderlich ist, müssen Sie einen Kontotyp angeben. Für die verwenden, verwenden Sie einen von Ihnen verwalteten Domainnamen. Das Framework nutzt es zur Verwaltung Ihrer Sync-Adapter verwenden, wird der Wert nicht an Ihren Server gesendet.
-
android:icon
-
Zeiger auf ein Drawable
Ressource mit einem Symbol. Wenn Sie den Synchronisierungsadapter sichtbar machen, indem Sie den Parameter
Attribut
android:userVisible="true"
inres/xml/syncadapter.xml
, müssen Sie diese Symbolressource angeben. Sie befindet sich im Bereich Konten der über die App „Einstellungen“ des Systems. -
android:smallIcon
-
Zeiger auf ein Drawable
Ressource mit einer kleinen Version des Symbols. Diese Ressource kann anstelle von
android:icon
im Bereich Konten der App "Einstellungen" des Systems je nach Bildschirmgröße. -
android:label
-
Lokalisierbarer String, der Nutzern den Kontotyp identifiziert. Wenn Sie den Synchronisierungsadapter erstellen
sichtbar ist, indem das Attribut
android:userVisible="true"
inres/xml/syncadapter.xml
eingeben, müssen Sie diesen String angeben. Sie erscheint in der Konten in der App "Einstellungen" des Systems neben dem Symbol, das Sie für das Authenticator.
Das folgende Snippet zeigt die XML-Datei für den Authenticator, den Sie zuvor erstellt haben:
<?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"/>
Authenticator im Manifest deklarieren
In einem vorherigen Schritt haben Sie eine gebundene Service
-Funktion erstellt, die den Authenticator verknüpft.
mit dem Synchronisierungsadapter-Framework. Du kannst diesen Dienst in deiner App deklarieren, damit er im System identifiziert werden kann
Manifest, indem Sie Folgendes hinzufügen:
<service>
-Elements als untergeordnetes Element von
<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>
Die
<intent-filter>
wird ein Filter eingerichtet, der von der Intent-Aktion ausgelöst wird.
android.accounts.AccountAuthenticator
, die vom System zur Ausführung des
Authenticator. Wenn der Filter ausgelöst wird, startet das System AuthenticatorService
,
Die gebundene Service
, die Sie angegeben haben, um den Authenticator zu umschließen.
Die
<meta-data>
-Element deklariert die Metadaten für den Authenticator. Die
android:name
verknüpft die Metadaten mit dem Authentifizierungs-Framework. Die
android:resource
-Element gibt den Namen der Authenticator-Metadatendatei an, die Sie zuvor erstellt haben.
Für einen Synchronisierungsadapter ist neben einem Authenticator auch ein Contentanbieter erforderlich. Wenn Ihre App nicht Wenn Sie bereits einen Contentanbieter verwenden, fahren Sie mit der nächsten Lektion fort, um zu erfahren, wie Sie Stub-Inhalte erstellen. Anbieter; Fahren Sie andernfalls mit dem Abschnitt Synchronisierungsadapter erstellen fort.