AndroidでTwitterのOauth認証(Twitter4j使用)
Andoridの入門書をざっくりとですが、一冊ほど目を通して、なんとなーく概要がつかめたので、少しずつえごリブアプリを作ってます。
で、えごリブはTwitterを使って認証してるのでAndroidでもOauth認証させる必要があったので、どうやるのか調べてみました。
基本的な流れはWebとあまり変わらない。
- TwitterFactory#getInstanceでtwitterインスタンスを作成(必要に応じてConsumeKeyとConsumeSecretKeyをセット)
- twitter#getOauthRequestTokenでリクエストトークンを作成
- requestToken#getAuthorizationURLで認証用URLを取得
- 認証画面に飛ばす(ブラウザを起動させる)
- 認証に成功したらアプリケーションに戻ってoauth_verifierパラメータを取得
- twitter#getOuathAccessTokenでアクセストークンを取得
- 取得したアクセストークンをプリファレンスに保存するなり、それを使用してツイートしたりご自由に
Webと違うのは認証後にブラウザから自分のアプリケーションを起動させるところ。
あとは大体同じ。
Webから自分のアプリケーションを起動させる方法はスキーマを設定してあげると出来る模様。
http://www.atmarkit.co.jp/fsmart/articles/androidmixi/01.html
上記サイトの流れと基本一緒です。(上記はmixiのOauth認証)
具体的なソースとかは下記みたいな感じ。
あ、ちなみにtwitter4jのバージョンは2.2.1です。
まずAndroidManifest.xmlを変更
<activity android:name=".common.TwitterOauth" android:label="@string/twitter_oatuh_title" android:launchMode="singleTask" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="egolib" android:host="callback" /> </intent-filter> </activity>
こんな感じ。
activityにlaunchModeを追加。
intentにスキーマを設定してます。
Androidのシミュレータ重いってレベルじゃねーぞ!
次にlayoutを作成
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> <TextView android:id="@+id/token" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> <TextView android:id="@+id/secret_token" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> </LinearLayout>
このサンプルは単純に認証が終わったらTextViewにAccessTokenの値を表示してるだけ。
Androidのシミュレータ重いってレベルじゃねーぞ!
で、Activityを作成
package sample.common; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.auth.AccessToken; import twitter4j.auth.RequestToken; import sample.android.R; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class TwitterOauth extends Activity { private static final String CALLBACK_URI = "egolib://callback"; private static final String VERIFIER = "oauth_verifier"; private Twitter twitter; private RequestToken requestToken; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.twitter_oauth); try{ //consumeKey,consumeSecretKeyはtwitter4j.propertiesに記述 twitter = new TwitterFactory().getInstance(); requestToken = twitter.getOAuthRequestToken(CALLBACK_URI); String url = requestToken.getAuthorizationURL(); Intent i = new Intent(Intent.ACTION_VIEW , Uri.parse(url)); //ブラウザ起動 startActivity(i); }catch(TwitterException e){ Log.e("oauth_error", e.getMessage()); } } /** * コールバック時 */ @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); TextView tv = (TextView)findViewById(R.id.tv); Uri uri = intent.getData(); if(uri == null || !uri.toString().startsWith(CALLBACK_URI)){ tv.setText("こんなの絶対おかしいよ。"); return; } AccessToken aToken = null; String verifier = uri.getQueryParameter(VERIFIER); if(verifier == null || verifier.length() == 0){ tv.setText("認証が拒否されたし。"); return; } try{ aToken = twitter.getOAuthAccessToken(requestToken, verifier); }catch(TwitterException e){ Log.e("oauth_error" , e.getMessage()); tv.setText("失敗した!"); return; } tv.setText("success"); TextView token = (TextView)findViewById(R.id.token); token.setText(aToken.getToken()); TextView sToken = (TextView)findViewById(R.id.secret_token); sToken.setText(aToken.getTokenSecret()); } }
エラー処理は適当です。
このActivityは起動した瞬間にTwitterの認証ページにすっ飛ばしてます。
使い方としては、他のActivityで認証ボタンなんかを用意して、このActivityに飛ばすとかって感じですかね。
おかしなところがあったら教えてくれるとうれしいです。
Androidのオプションメニューのアイコンに標準のものを使用する
絶対使うけど、絶対忘れそうなのでメモ。
オプションメニューにアイコンを指定するときに、標準のシステムアイコンを使用するやり方。
android:icon="@android:drawable/ic_menu_add"
使えるアイコンの種類は下記サイトに載ってる。
Javaでメニューを設定する場合のやり方も載ってる。
http://www.taosoftware.co.jp/blog/2008/11/android_5.html
あと自作でアイコン作る場合はジェネレータがあった。ちょっと画像書き出してみたけど超便利そう!まぁアイコン作る技術はないわけだが。
EclipseでAndroid開発環境
CakePHPの勉強は一段落したのと(マスターしたわけではない)、会社のスマフォを少し自由に使えるようになったので、今度はAndroidアプリの勉強をする。もう本も買ってしまった。Webのほうももう少し機能追加したいところもあるけどとりあえずおいておいておく。ディスガイア4はニャンコ海賊団がでなくて修羅いけないし。
まぁ僕はスマフォ持ってないんですけどね!夏モデルが発表されたら買うかも、買わないかも。
というわけで、まずはEclipseで開発環境を整えるメモ。
ここがとってもよくまとまってました。ほとんどこれのまま。
http://sky.geocities.jp/izeefss/develop/android/env_eclipse.html
Android SDKをダウンロード
http://developer.android.com/index.html
ここのDownloadから環境にあったものを落としてくる。
今回は「android-sdk_r10-windows.zip」を取得。
ダウンロードしたら、解凍して任意のフォルダに。
ADTをインストール
EclipseでAndroidアプリを開発するためのプラグインをインストール
ヘルプ→新規ソフトウェアのインストール
作業対象に
https://dl-ssl.google.com/android/eclipse/
を入力して、追加ボタンを押して名前にはADTとかAndroidoPluginとか入れる。
4つくらい出てくるので全てチェックしてインストール。色々聞かれるけど全てイエス。終わったら再起動。
AndoroidPlatformAPIのインストール
Eclipseのウィンドウ→Android SDKおよびADVマネージャー
InstalledPackageを選択してUpdateAllを押す
必要なパッケージにチェックを入れてインストール
基本的に最新のバージョンさえあれば下位のAPIも含まれているらしいけど、
下位のバージョンで開発する場合はそのパッケージが必要になるらしい。
とりあえず僕は1.6以降全部いれておきました。
これでおしまい。
一応HelloWorldまではやったけど、当分は入門書を読み進めながらサンプルを動かしていくつもり。
iPhoneアプリは少しかじったことがあるけど、Andoroidはどうなんでしょうか。コンポーネントとかどの程度用意されてるんだろ。まぁそもそもAndoroidアプリいじったことをほとんど無いので、定番のUIとかも調べる必要があり、覚えることはかなりありそう。
最終目標はもちろんえごリブ for Android。出来るのはいつになるやら。
目標があると勉強するモチベーションもきっと続くはず。多分。メイビー。
まぁディスガイア4優先だな…。