Создание заглушки аутентификатора

Платформа адаптеров синхронизации предполагает, что ваш адаптер синхронизации пересылает данные между хранилищем на устройстве связанным с учетной записью и хранилищем на сервере, который требует авторизацию. По этой причине, платформа ожидает, что вы предоставите компонент, называемый аутентификатор, как часть вашего адаптера синхронизации. Этот компонент подключается к учетной записи Android и платформой аутентификации, и предоставляет стандартный интерфейс для обработки учетных данных пользователей.

Даже если ваше приложение не использует учетные записи, вам все равно нужно предоставить компонент аутентификации. Если вы не используете учетные записи или логин для доступа к серверу, информация обработанная аутентификатором игнорируется, так что вы можете предоставить компонент аутентификации, реализация которого содержит заглушки для методов. Кроме того, необходимо предоставить Service который позволяет платформе адаптеров синхронизации вызывать методы аутентикатора.

Этот урок покажет вам, как определить все части заглушки аутентификации, которые вам нужны, чтобы удовлетворить требованиям платформы адаптеров синхронизации. Если вам нужно обеспечить реальную проверки подлинности, которая обрабатывает учетные записи пользователей, читайте справочную документацию по AbstractAccountAuthenticator.

Добавление заглушки компонента аутентификации

Чтобы добавить компонент заглушки аутентификации в ваше приложение, создайте класс расширяющий AbstractAccountAuthenticator, а затем создайте заглушки для необходимых методов, либо путем возврата null либо выбрасывая исключение.

В следующем фрагменте показан пример класса заглушки аутентификации:

/*
 * 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();
    }
}

Связь аутентификатора с платформой

Чтобы платформа синхронизации получила доступ к вашему аутентификатору, необходимо создать для него службу. Эта служба обеспечивает связь, которая позволяет платформе вызывать ваш аутентификатор и обмениваться данными между аутентификатором и платформой.

Поскольку платформа запускает этот Service , когда необходимо получить доступ к аутентификатору в первый раз, вы также можете использовать сервис для создания экземпляра аутентификатора, путем вызова конструктора аутентификатора в Service.onCreate() методе службы.

В следующем фрагменте показано, как определить Service:

/**
 * 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(this);
    }
    /*
     * 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();
    }
}

Добавление аутентификатора в файл метаданных

Чтобы подключить компонент аутентификации к адаптеру синхронизации и платформе учетных записей, необходимо предоставить платформе метаданные, описывающие компонент. Эти метаданные объявляют тип учетной записи, созданной для вашего адаптера синхронизации, и элементы пользовательского интерфейса, которые система отображает, если вы хотите, чтобы ваш тип учетной записи был видимый для пользователя. Объявите эти метаданные в XML файле, расположенном в /res/xml/ каталоге в вашем проекте приложения. Вы можете дать любое имя файла, хотя обычно он называется authenticator.xml.

Этот XML-файл содержит один элемент <account-authenticator> , который имеет следующие атрибуты:

android:accountType
Платформа адаптеров синхронизации требует, чтобы каждый адаптер синхронизации имел тип учетной записи, в виде доменного имени. Платформа использует тип учетной записи как часть внутренней идентификации адаптера синхронизации. Для серверов, которые требуют логин, тип учетной записи вместе с учетной записью пользователя отправляются на сервер как часть учетных данных входа.

Если ваш сервер не требует логин, вам все равно придется предоставить тип учетной записи. В качестве значения, используйте доменное имя, которое вы контролируете. Платформа использует его для управления адаптером синхронизации, однако значение не будет передаваться на сервер.

android:icon
Указатель на Drawable ресурс, содержащий значок. Если вы сделаете адаптер синхронизации видимым, указав атрибут android:userVisible="true" в res/xml/syncadapter.xml, то вы должны предоставить этот ресурс значка. Он появится в разделе Аккаунты в системных настройках.
android:smallIcon
Указатель на Drawable ресурс, содержащий уменьшенную версию значка. Этот ресурс может быть использован вместо android:icon в разделе Аккаунты в настройках системы, в зависимости от размера экрана.
android:label
Локализуемая строка, определяющая тип учетных записей пользователей. Если вы сделаете адаптер синхронизации видимым, указав атрибут android:userVisible="true" в res/xml/syncadapter.xml, то вы должны предоставить эту строку. Она появляется в разделе Аккаунты в настройках системы, рядом со значком, который вы определили для аутентификатора.

Следующий фрагмент показывает XML файл для аутентификатора, который вы создали ранее:

<?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"/>

Объявление аутентификатора в манифесте

В предыдущем разделе, вы создали Service , который связывает аутентификатор и платформу адаптеров синхронизации. Для идентификации этого сервиса в системе, объявите его в манифесте вашего приложения, добавив <service> элемент в качестве дочернего элемента <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>

<intent-filter> элемент настраивает фильтр, который срабатывает для действия android.accounts.AccountAuthenticator, который посылается системой для запуска проверки подлинности. Когда фильтр срабатывает, система запускает AuthenticatorService, связанный Service , который вы предоставили, чтобы обернуть аутентификатор.

<meta-data> элемент объявляет метаданные для аутентификатора. android:name атрибут связывает метаданные с платформой аутентификации. android:resource элемент задает имя файла метаданных аутентификатора, созданного ранее.

Кроме аутентификата, адаптер синхронизации также требуется провайдер контента. Если ваше приложение не использует провайдер контента, перейдите к следующему уроку, чтобы узнать, как создать заглушки провайдера контента; в противном случае перейти к уроку Создание адаптера синхронизации.