スタブ認証システムを作成する

同期アダプター フレームワークでは、同期アダプターがデバイス ストレージ間でデータを転送することを前提としています。 ログイン アクセスを必要とするアカウントとサーバー ストレージに関連付けられている。このため、 フレームワークは、同期処理の一環として認証システムと呼ばれるコンポーネントを提供することを想定しています。 設定してください。このコンポーネントは、Android アカウントと認証フレームワークに接続し、 は、ログイン情報などのユーザー認証情報を処理するための標準インターフェースを提供します。

アプリでアカウントを使用しない場合でも、認証システム コンポーネントを提供する必要があります。 アカウントやサーバー ログインを使用しない場合、認証システムで処理される情報は スタブメソッドを含む認証システム コンポーネントを指定できます。 あります。バインドされた Service も指定する必要があります。 同期アダプター フレームワークで認証システムのメソッドを呼び出すことができます。

このレッスンでは、スタブ認証システムの必須部分を定義する方法を説明します。 同期アダプター フレームワークの要件を満たす必要があります。実際の ID を については、次のリファレンス ドキュメントをご覧ください: AbstractAccountAuthenticator

スタブ認証システム コンポーネントを追加する

スタブ認証システムコンポーネントをアプリに追加するには、 AbstractAccountAuthenticator を作成し、必要なメソッドをスタブアウトする。 null を返すか、例外をスローします。

次のスニペットは、スタブ認証システムクラスの例を示しています。

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

認証システムをフレームワークにバインドする

同期アダプター フレームワークが認証システムにアクセスするには、 対応できます。このサービスは、フレームワークの実行を可能にする Android バインダ オブジェクトを提供します。 を呼び出して、認証システムとフレームワークの間でデータを渡します。

次のスニペットは、バインドされた Service を定義する方法を示しています。

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

認証システム メタデータ ファイルを追加する

認証システム コンポーネントを同期アダプターとアカウント フレームワークに接続するには、以下を行う必要があります。 コンポーネントを記述するメタデータをフレームワークに提供します。このメタデータは、 同期アダプター用に作成したアカウント タイプを指定し、ユーザー インターフェース要素を宣言します。 (アカウントの種類をユーザーに表示する場合)に表示される名前を入力します。これを宣言 メタデータ(アプリ プロジェクトの /res/xml/ ディレクトリに保存されている XML ファイル)にメタデータを追加します。 ファイルには任意の名前を付けることができますが、通常は authenticator.xml と呼ばれます。

この XML ファイルには、次の要素である <account-authenticator> が 1 つ含まれています。 次の属性があります。

android:accountType
同期アダプター フレームワークでは、各同期アダプターに次の形式のアカウント タイプが必要です。 学びます。フレームワークは、同期アダプターの一部としてアカウント タイプを使用します。 あります。ログインが必要なサーバーでは、アカウントの種類と ユーザー アカウントが、ログイン認証情報の一部としてサーバーに送信されます。

ログインが不要なサーバーについても、アカウント タイプを指定する必要があります。対象: 管理しているドメイン名を使用してください。フレームワークはこれを使用して、 値はサーバーに送信されません。

android:icon
ドローアブルへのポインタ リソースです。同期アダプターを表示する場合は、 res/xml/syncadapter.xml の属性 android:userVisible="true"、 このアイコン リソースを指定する必要があります。これは Google Chat の [アカウント] セクションで システムの設定アプリ
android:smallIcon
ドローアブルへのポインタ リソースです。このリソースは、代わりに システムの設定アプリの [アカウント] セクションで 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 要素は、前に作成した認証システム メタデータ ファイルの名前を指定します。

認証システムに加えて、同期アダプターにはコンテンツ プロバイダが必要です。アプリが コンテンツ プロバイダをすでに使用している場合は、次のレッスンに進み、スタブ コンテンツの作成方法をご確認ください。 プロバイダそれ以外の場合は、同期アダプターを作成するに進んでください。