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
などを取得できるようになります。

これはTwitter APIにアクセスしているアプリが本アプリであることを示すIDなので取り扱いには注意してください。

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ファイルをプロジェクトに組み込みます。

eclipseAndroidプロジェクトを作成して、プロジェクト直下にlibディレクトリを作成し、lib以下に上記のjarファイルをコピーします。今回はStreamingAPIを使うので、下記2つのjarファイルが必要になります。

  • twitter4j-core-android-2.2.5.jar
  • twitter4j-streaming-android-2.2.5jar

プロジェクトのコンテクストメニューから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);
					}
				});
			}


コードはこちら。
https://github.com/itog/Twitter4j-android-Sample