2011年09月18日

[Android] アカウント管理を行う(アカウントの追加)

前回の続きです。

前回はAndroid側にアカウントの定義をわかってもらうところまでやりました。
今回はとりあえずアカウントを作成できるようにしたいと思います。
サンプルなのであんまりめんどくさいことはやりません。
「アカウントと同期」→「アカウントの追加」→「Sampleアカウント」と選ばれたら、即アカウント作成とします。
ただ、重複はNGにします。アカウントは1個しか作りません。

さて、前回のプロジェクトで空実装だったAuthenticatorを実装していきましょう。
アカウントを作成できるようにするには、addAccount()を実装します。

@Override
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException {
return null;
}

前回はこんなコードでした。nullを返しているだけです。
ここに処理を追加し、アカウントを作ります。
アカウントはAccountクラスです。
インスタンスの作り方は↓こう。

Account account = new Account("アカウント名", "アカウントタイプ");

"アカウント名"は通常ユーザに入力してもらうものかと思いますけど、今回は固定値で"Sample"としておきます。
"アカウントタイプ"はaddAccountの引数accountTypeをそのまま使いましょう。

そして、アカウントを作るには↓こう。

AccountManager am = AccountManager.get(mContext);
am.addAccountExplicitly(account, "Password", null);

AccountManagerのaddAccountExplicitly()で作ることができます。
"Password"はパスワードです。これも固定値にしちゃってます。
アカウントを作るのであれば、これだけです。簡単です。
上で言っていた重複判定なんかは、いつものようにサンプルコードを置いておくので、そちらを見てくださいまし。

なお、addAccount()の戻り値はBundleです。
いろいろと自由に値を詰めることができます。
一応、AccountManagerにはすでにキーの定義がいくつかあります。
エラーコードやエラーメッセージを返す必要があるときは、AccountManagerで定義されたものを使うと良いでしょう。

また、今回のサンプルコードを実行するために以下の2つのパーミッションが必要です。

android.permission.GET_ACCOUNT
android.permission.AUTHENTICATE_ACCOUNTS

忘れずにManifestに書いておいてください。
実際にアカウントを追加してみるとこんな感じです。
device-2011-09-18-173754.png device-2011-09-18-173828.png
アカウントの追加は以上です。
また、サンプルコードを置いておくので、よろしかったら見てください。
AccountSample.addAccount.zip
タグ:android
posted by t2low at 17:53| Android

2011年09月12日

[Android] アカウント管理を行う

最近、仕事でアカウントを使うコードを書きました。
後々使えそうなところなので、忘れないうちにサンプルコードでも書いて、メモっとこうと思ってこの記事を書いています。
ちなみにアカウントと言っているのは、Android端末の「設定」→「アカウントと同期」のとこに出てくる「アカウント」のことです。

Eclipseを起動します。
プロジェクトを作ります。Androidのやつです。
とりあえず、Activityは要りません。

アカウントの情報を定義しているのはxmlです。たぶん。
resフォルダにxmlフォルダを作りましょう。
その中にxmlを作ります。
Android SDKに付属のサンプル(SampleSyncAdapter)に倣って、authenticator.xmlという名前にしました。

編集します。
<account-authenticator>というタグとその属性を書きます。
↓こんな感じ。

<account-authenticator
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.tappli.android.sample.account"
android:icon="@drawable/icon"
android:smallIcon="@drawable/icon"
android:label="@string/account_label" />

ちなみにコレ↑、ほぼSampleSyncAdapterのコピペです。
<account-authenticator>ってタグの説明が見つけられなくて困ってます。
どなたかリファレンスのどこを見たら載っているのか教えてくだしあ。

android:accountTypeってのは自分で何か指定してください。
パッケージ名じゃなくて良いと思います。
このアカウントを作ったり、このアカウントからトークン取得するときとかに必要になります。
android:labelは「アカウントと同期」からアカウントを追加するときに表示される名前ですね。
res/values/string.xmlに「Sampleアカウント」と定義しました。


さて、このアカウントの定義をAndroidにわかってもらうために、Manifestに書いとく必要があります。
SampleSyncAdapterを見ると<service>タグの中の<meta-data>としてauthenticator.xmlが指定されています。
同じようにするためにServiceを準備しましょう。
一旦Manifestは置いときます。

SampleSyncAdapterを参考にすると、Serviceの中でAuthenticatorというものが必要なようです。
Serviceも置いといて、先にAuthenticatorを片付けましょう。
AuthenticatorはAbstractAccountAuthenticatorというクラスを継承すれば良いようです。
とりあえずとして、まずは空のAuthenticatorを作りましょう。
コンストラクタと以下のメソッドをoverrideします。
・addAccount
・confirmCredentials
・editProperties
・getAuthToken
・getAuthTokenLabel
・hasFeatures
・updateCredentials
とりあえずなのでメソッドの中身はすべて「return null;」のみです。
これでAuthenticatorができました。

んで、Serviceに戻ります。
Serviceは普通のServiceを継承すれば良いようです。
onCreate()でAuthenticatorのインスタンスを作って、onBind()でIBinderを返却するだけ。
これもSampleSyncAdapterのほぼコピペでいけますね。

最後にManifestを編集します。
これもSampleSyncAdapterをコピペして、クラス名とandroid:resourceの部分を自分の環境に合わせれば十分そう。
こんな感じになります。

<service
android:name=".AuthenticationService"
android:exported="true"
>
<intent-filter>
<action
android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data
android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator" />
</service>

これでたぶん最低限の準備は整いました。
サンプルを起動してみましょう。サンプルをエミュレータでも実機でも良いので転送してみてください。
Activityがないのでアプリとしては起動しないです。
Android端末の「設定」→「アカウントと同期」を開いてください。
「アカウントを追加」というボタンがあるのでタップします。
最初にauthenticator.xmlで指定したラベル名が表示されていたら成功です。
device-2011-09-10-194934.png
ただ、Authenticatorの中身が空なので、タップしても何も起きません。
次はこの中身を作っていこうと思います。

もしかしたら一部の人でこのサンプルを動かすと端末がリセットするようなことがあるかも知れません。
これはアプリのバグというよりはAndroidのバグっぽいです。
Android2.1のソースを見たら、nullチェックをせずにfor文にリストを突っ込んでいるところがあって、そこでヌルポが発生していました。
一応、回避方法はあって、「アカウントと同期」の「同期」の方も実装すると大丈夫っぽいです。
AbstractThreadedSyncAdapterを実装して使えるようにしろってことになります。
この辺はまだ全然理解できていないので、おいおいやっていこうと思います。
実機で動かないって人はとりあえずエミュレータ使っといてください。

このサンプルコードはこちら↓
AccountSample.zip

9/18 続きを書きました。
タグ:android
posted by t2low at 00:33| Android