Twitter4Jを使ってAndroidアプリでStreamingAPIのUserTimelineを取得する
以前も書きましたがTwitter4j-android で oauth 認証 - Hacking My Way 〜 itogのhack日記、StreamingAPI使ったのとコードすっきりできたので改めてTwitter4Jを使ってAndroidでUserTimelineをStreamingAPIで取得する方法を紹介します。
Twitterアカウントを作成する
まず、アカウントを持っていなければTwitterのトップページから開発者のTwitterアカウントを作成します。
https://twitter.com/
Twitter連携アプリを登録する
上記で作成したアカウントで、Twitterの開発者用ページにサインインします。右上のSign Inボタンからサインインしてください。
Create an Appのリンクをクリックします。
ここでアプリの情報を入力します。
- Name : アプリケーションの名前を記入します
- Description : アプリケーションの説明を記入します
- WebSite : アプリケーションのURLを指定します
- Callback URL : webアプリの場合は認証されたあとにコールバックされるURL指定しますが、ここで紹介する使い方では使用しませんので任意のURLを埋めておきます。
アプリケーションが登録されると、アプリごとに
Consumer key、Consumer secret
などを取得できるようになります。
Androidプロジェクトを作成する
http://twitter4j.org/en/index.html#download から最新のtwitter4j-androidライブラリを取得します。2/14時点でtwitter4j-android-2.2.5.zipです。
zipファイルを展開し、twitter4j-android-2.2.5/lib/ 以下にできるjarファイルをプロジェクトに組み込みます。
eclipseでAndroidプロジェクトを作成して、プロジェクト直下にlibディレクトリを作成し、lib以下に上記のjarファイルをコピーします。今回はStreamingAPIを使うので、下記2つのjarファイルが必要になります。
プロジェクトのコンテクストメニューからPropertiesを開いて、
Java Build Path -> Add JARs…
で上記2つのファイルをビルドパスに追加します。
- Manifest
インターネット通信を使うのでManifestにINTERNETパーミッションを追加します。
<uses-permissionandroid:name="android.permission.INTERNET"></uses-permission]]>
OAuth認証する
OAuth認証するには、アプリからTwitterの認証ページを開き、ユーザが許可をしたらcallbackを受け取り、トークンを保存するという手順で行います。
Webアプリであれば、callbackには適宜有効なURLを指定するのですが、Androidアプリの場合はアプリ(Activity)がcallbackされて欲しいのでIntent Filterを設定して、固有のURLでIntentを受け取るようにします。
- Manifest
callback urlが呼ばれた時にIntentを受け取るようにフィルターを設定します
<intent-filter> <actionandroid:name="android.intent.action.VIEW"/> <categoryandroid:name="android.intent.category.DEFAULT"/> <categoryandroid:name="android.intent.category.BROWSABLE"/> <dataandroid:scheme="oauth"android:host="t4jsample"/> </intent-filter>
ログインボタンをクリックでOAuth認証をリクエストします。
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.setOAuthConsumerKey(Const.CONSUMER_KEY); configurationBuilder.setOAuthConsumerSecret(Const.CONSUMER_SECRET); Configuration configuration = configurationBuilder.build(); twitter = new TwitterFactory(configuration).getInstance(); try { requestToken = twitter.getOAuthRequestToken(Const.CALLBACK_URL); Toast.makeText(this, "Please authorize this app!", Toast.LENGTH_LONG).show(); this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL()))); } catch (TwitterException e) { e.printStackTrace(); } }
- コールバックされた時の処理
onCreate()内で、上のフィルターのIntentで呼ばれた場合にトークンをPreferencesに保存します。
Uri uri = getIntent().getData(); if (uri != null && uri.toString().startsWith(Const.CALLBACK_URL)) { String verifier = uri.getQueryParameter(Const.IEXTRA_OAUTH_VERIFIER); try { AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier); Editor e = mSharedPreferences.edit(); e.putString(Const.PREF_KEY_TOKEN, accessToken.getToken()); e.putString(Const.PREF_KEY_SECRET, accessToken.getTokenSecret()); e.commit(); } catch (Exception e) { Log.e(TAG, e.getMessage()); Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); } }
UserStreamingを取得する
取得したトークンを元にUserStreamのインスタンスを生成します。
String oauthAccessToken = mSharedPreferences.getString(Const.PREF_KEY_TOKEN, ""); String oAuthAccessTokenSecret = mSharedPreferences.getString(Const.PREF_KEY_SECRET, ""); ConfigurationBuilder confbuilder = new ConfigurationBuilder(); Configuration conf = confbuilder .setOAuthConsumerKey(Const.CONSUMER_KEY) .setOAuthConsumerSecret(Const.CONSUMER_SECRET) .setOAuthAccessToken(oauthAccessToken) .setOAuthAccessTokenSecret(oAuthAccessTokenSecret) .build(); twitterStream = new TwitterStreamFactory(conf).getInstance(); buttonLogin.setText(R.string.label_disconnect); getTweetButton.setEnabled(true);
リスナーを設定します。
twitterStream.addListener(listener); twitterStream.user();
最後に、ツイートをViewに表示します。UIスレッド外なのでTextView.appens()を直接呼ぶのではなく、View.postする必要があります。
@Override public void onStatus(Status status) { final String tweet = "@" + status.getUser().getScreenName() + " : " + status.getText() + "\n"; System.out.println(tweet); tweetText.post(new Runnable() { @Override public void run() { tweetText.append(tweet); scrollView.fullScroll(View.FOCUS_DOWN); } }); }