アカウント追加用のログイン画面を作成する
最終更新日: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側に渡します。