Android用のTwitterクライアントを作ってみる2
前回のアプリをもうちょっとのリッチに・・・
っていうか、あんなのじゃアプリというにもおこがましいですよねw
というわけで、どう考えても必要な機能を追加してみました。
・ID/Pass の設定
前回のソースを軸に ID等を設定するActivityを作成し、Intentを使用して呼び出します。
ID等の保管には SharedPreferences を使用するので、一度設定すればアプリがアンインストールされるまで「たぶん」記憶されます。
以下のような感じで作成します。
・本体Activity(Main.java)
・アプリ起動
・ID/Passが設定されているかを確認
・されてなければ設定画面を呼び出す
・ID設定Activityの呼び出しは、menuボタン押下時のオプションメニューに追加
・後は前回と同じような感じ
・ID設定Activity(SetID.java)
・ID/Passの現在設定を取得しEditTextに設定
・OKが押されたら、ID等を認証確認し問題なければ設定
・Cancelが押されたら、現在設定のまま終了(ただし現在設定すらない場合はNG)
layout/main.xml
前回から変更なし
layout/setid.xml
ボタン二つとEditText二つ備えたlayoutを作成すればよし。
android:inputType="textPassword" をEditTextに指定すれば、いかにもパスワード入力っぽくなります。
AndroidManifest.xml
アクティビティを増やしたので、追加したものはしっかり記述する。
忘れると実行時に怒られます。
・<activity android:name=".SetID"></activity>
value/strings.xml
文字列をlayoutで設定した場合は、このxmlを編集します。
SetID.java
全部見てやろう
/*重要そうな箇所を抜粋*/
// プリファレンスからID/Passを取得
// getSharedPreferences("プリファレンス名", 取得モード);で取得
SharedPreferences preferences = getSharedPreferences( getString(R.string.preferences_name), MODE_PRIVATE);
// preferences.getString("キー名", デフォルト値)で、対象のプリファレンスからキー名に設定されている値を取得します。
// 設定値がなければデフォルトが返ります。
// getString 以外にもgetInt とか getFloat getLong getBoolean とかあります。
String orgid = preferences.getString( getString(R.string.preferences_id), "");
String orgpass = preferences.getString( getString(R.string.preferences_pass), "");
// プリファレンスに値を設定
SharedPreferences preferences = getSharedPreferences( getString(R.string.preferences_name), MODE_PRIVATE);
// Editor を取得
SharedPreferences.Editor editor = preferences.edit();
// putString( "キー名", 値) で対象のプリファレンスのキーに値を設定
editor.putString( getString(R.string.preferences_id), tempid);
editor.putString( getString(R.string.preferences_pass), temppass);
// commit を読んだ時点で設定される。
editor.commit();
// 呼び出しActivityに値を返して終了する
setResult(int値);
// アプリの終了を発行
finish();
ソース全文張ったら長いので、今後とも必要になりそうな箇所を抜粋
なお、ID/Passの認証のチェックには
http://twitter.com/account/verify_credentials.format
を使用。
「この API は認証情報(BASIC認証で使うユーザ名とパスワードの組み合わせ)が有効かどうかを確認するのに利用することができる」
とありましたので、そのようにしました。
一応認証に成功したら
http://twitter.com/account/end_session.format
を呼び出しています。
なお、TwitterAPIの仕様書を日本語に翻訳してくれている方がいらっしゃいますので、詳細はそちらを
観測気球様 Twitter API 仕様書 (勝手に日本語訳シリーズ)
Main.java
全部見てやろう
/*重要そうな箇所を抜粋*/
// オプションメニューを作成
// Activity クラスからのオーバーライドで作成
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO 自動生成されたメソッド・スタブ
super.onCreateOptionsMenu(menu);
// 第二引数で設定するItemIDで
// onMenuItemSelected で判定する
// 第四引数に表示するメニュー名を入れる
// menu.add("メニュー名"); でも追加できるけど、
// その場合のItemIDとかはどうなるんだろ?
// 少なくとも今回はその辺はパス
menu.add( 0, 0, 0, R.string.Set_id_pass);
return true;
}
// オプションメニューの動作を決定
// Activity クラスからのオーバーライドで作成
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// TODO 自動生成されたメソッド・スタブ
super.onMenuItemSelected(featureId, item);
// 上記でmenu.add の第四引数で判別
// なんだか久しぶりに VCで Win32 app を作っている気分です。
switch( item.getItemId()){
case 0: //R.string.Set_id_pass
// TODO ここに処理を記載
break;
}
return true;
}
// 子アクティビティの呼び出し
// Mainクラスから、呼び出す子クラスを設定
Intent intent = new Intent(Main.this, SetID.class);
// アクティビティの起動
// ここで起動したアクティビティからの結果は
// onActivityResultで受け取る
// 第二引数は、ほかにも呼び出すアクティビティがいるなど
// 判定が必要な場合には考えて設定する
startActivityForResult(intent, 0);
// 子アクティビティからの結果を受け取る
// Activity クラスからのオーバーライドで作成
@Override
// 第一引数はstartActivityForResult の第二引数で設定した値が
// 第二引数はsetResult(int値) で発行された値が格納される
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO 自動生成されたメソッド・スタブ
// setResult(int値) で発行された値で判定
if (resultCode == RESULT_OK) {
// 処理を記載
}
}
前回からちょこちょこっと変更した箇所もありますが、大きくは
・Intentを使って別のActivityを呼び出す
・menuボタンを押した時に、オプションメニューが出る
くらいでしょう。
相変わらず、Activityのサイクルを考慮したコードなんか書いていません。
あげく、TwitterAPIの使用回数制限とかも無視しまくり。
流用しよう、なんていう奇特な方が勝手に直してくれることを期待しています。
ってか、いいサンプルあったり、素敵な修正がある場合は教えてくださいw
次は
・何分かに一回 home_timeline を取得に行く
・変更があったら通知バーに通知する
というようなサービスでも作りますか?
動かすとこんな感じ。
なんかメニュー画面が出るとか、それっぽい感じがします。
menuボタンからID設定画面へ
前回設定したidとpasswordが。(もちろんpassword とかは適当なものに打ち直していますよw)

android:inputType="textPassword" を設定している場合。
なんだかそれっぽいw

参考 「Android プログラミング入門」
・第二部 3.2.2 サブアクティビティからの応答を受け付ける
・第二部 5.1 プリファレンス
・第三部 1.3.5 メニュー
- 関連記事
- Android Serviceで困ったこと (01/17)
- Android アプリの多重起動禁止 (01/17)
- Android用のTwitterクライアントを作ってみる2 (01/10)
- Android用のTwitterクライアントを作ってみる (01/09)
- Android 自分の位置をMap上に描画3 (12/31)










