モケラ

Tech Sheets

mokelab

アカウント追加用のログイン画面を作成する

最終更新日:2015-07-01

Authenticatorを実装するでアカウント追加用の画面遷移方法を紹介しました。ここでは、実際にアカウントを追加するための画面(Activity / Fragment)の実装方法を紹介します。

ここまで実装したものはここにあります。

Activityを実装する

Authenticatorから起動されるActivityは次のように実装します。Android SDKのサンプルではAccountAuthenticatorActivityを継承したものを使用していますが、これを使用するとAppCompatActivityではなくなるので、ここではAccountAuthenticatorActivity相当のものを実装しています。

public class LoginActivity extends AppCompatActivity {
    private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
    private Bundle mResultBundle = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        Intent intent = getIntent();
        mAccountAuthenticatorResponse = intent.getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
        if (mAccountAuthenticatorResponse != null) {
            mAccountAuthenticatorResponse.onRequestContinued();
        }

        if (savedInstanceState == null) {
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();

            transaction.add(R.id.container, LoginFragment.newInstance());

            transaction.commit();
        }
    }

    public final void setAccountAuthenticatorResult(Bundle result) {
        mResultBundle = result;
    }

    @Override
    public void finish() {
        if (mAccountAuthenticatorResponse != null) {
            // send the result bundle back if set, otherwise send an error.
            if (mResultBundle != null) {
                mAccountAuthenticatorResponse.onResult(mResultBundle);
            } else {
                mAccountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED,
                        "canceled");
            }
            mAccountAuthenticatorResponse = null;
        }
        super.finish();
    }
}

まず、IntentからAccountAuthenticatorResponseオブジェクトを取り出し、フィールドにセットしておきます。これは呼び出し元に結果を伝えるためのオブジェクトで、finish()時に確実に結果を伝えるためにフィールドにいれておきます。

取り出せたらonRequestContinued()を呼んでおきます。AccountAuthenticatorActivityで呼んでいるので必要だとは思うのですが、ドキュメントには何も記述がないぞ。。。

Fragmentを実装する

ダイアログの扱いを考えると、ログイン画面自体はFragmentで実装したほうがよいでしょう。重要な部分だけ説明します。

@InjectView(R.id.edit_username)
EditText mUsernameEdit;

@InjectView(R.id.edit_password)
EditText mPasswordEdit;

// onCreate()あたりで生成しておく
private AccountManager mAccountManager;

@OnClick(R.id.button_login)
void loginClicked() {
    // do something
    String username = mUsernameEdit.getText().toString();
    String password = mPasswordEdit.getText().toString();

    LoginActivity activity = (LoginActivity) getActivity();
    if (activity == null) { return; }

    Account account = new Account(username, ACCOUNT_TYPE);
    mAccountManager.addAccountExplicitly(account, password, null);

    Intent intent = new Intent();
    intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, username);
    intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, ACCOUNT_TYPE);
    activity.setAccountAuthenticatorResult(intent.getExtras());
    activity.setResult(Activity.RESULT_OK, intent);
    activity.finish();
}

サンプルなので、入力されたユーザー名/パスワードをサーバーに送って確認する部分は省略しています。

アカウントの追加処理はAccountManagerのaddAccountExplicitly()で行います。実行するには をAndroidManifest.xmlに追加する必要があります。

ここでは第2引数にパスワードをそのまま保存していますが、セキュリティ面を考慮すると、AESあたりで暗号化したものを渡したほうがよいでしょう。

アカウントの登録が完了したら、Intentに作成したアカウント情報(アカウント名と種類)をセットし、ベースとなるActivity側に渡します。

一覧に戻る