テストアプリなのでアレですが、結構はまったので公開しておきます。
MainActivity.java
package com.example.atwitter; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import twitter4j.Paging; import twitter4j.ResponseList; import twitter4j.Status; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.User; import twitter4j.conf.ConfigurationBuilder; import twitter4j.http.AccessToken; import twitter4j.http.RequestToken; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { // キー private static String CONSUMERKEY ="XXXXXX"; private static String CONSUMERSECRET ="XXXXXX"; private static String ACCESSTOKEN ="XXXXXX"; private static String ACCESSSECRET ="XXXXXX"; // コールバックURL private final String CALLBACK_URL="testapp://atwitter/"; private static String SNL = System.getProperty("line.separator"); private static String DNL = SNL + SNL; // Twitter private Twitter twitter; private AccessToken accessToken; // TextView private TextView textView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Twitterの初期化 initializeTwitter(null); // TextViewを保持 textView = (TextView)findViewById(R.id.TextView01); // ボタンにコールバックを登録 Button button = (Button)findViewById(R.id.Auth); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // twitterアクション実行 String result = doOAuth(twitter); textView.setText(result); } }); button = (Button)findViewById(R.id.Button01); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // twitterアクション実行 String result = userTimeline(twitter); textView.setText(result); } }); } private void initializeTwitter(AccessToken accessToken) { ConfigurationBuilder confBuilder = new ConfigurationBuilder(); confBuilder.setOAuthConsumerKey(CONSUMERKEY); confBuilder.setOAuthConsumerSecret(CONSUMERSECRET); TwitterFactory twitterFactory = new TwitterFactory(confBuilder.build()); twitter = twitterFactory.getOAuthAuthorizedInstance(accessToken); } public String userTimeline(Twitter twitter){ ResponseListポイントは、statuses = null; // String result = "print userTimeline:" + DNL; int pageNumber =1; int count = 20; //Paging Paging paging = new Paging(pageNumber, count); try { statuses = twitter.getUserTimeline(paging); if (statuses != null) { for (Status status :statuses) { result += status.getUser().getScreenName() +":" + SNL + status.getText() + DNL; } } } catch (Exception e) { result += e.getMessage(); e.printStackTrace(); } return result; } private String doOAuth(Twitter twitter_) { String result = "doOAuth:" + DNL; Twitter twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer(CONSUMERKEY, CONSUMERSECRET); // RequestTokenを取得 RequestToken requestToken = null; try { requestToken = twitter.getOAuthRequestToken(CALLBACK_URL); } catch (TwitterException e) { result += e.getMessage() + DNL; e.printStackTrace(); } // RequestTokenを保存 ObjectOutputStream oos; try { OutputStream out = openFileOutput("RequestToken", MODE_PRIVATE); oos = new ObjectOutputStream(out); oos.writeObject(requestToken); } catch (Exception e) { result += e.getMessage() + DNL; e.printStackTrace(); } // 認証ページへ String strUrl = requestToken.getAuthorizationURL(); Uri uri = Uri.parse(strUrl); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); result += strUrl; return result; } // 起動時に呼ばれる(認証完了時も呼ばれる) @Override public void onResume() { super.onResume(); String result = ""; // extract the OAUTH access token if it exists Uri uri = this.getIntent().getData(); if (uri != null && uri.toString().startsWith(CALLBACK_URL)) { RequestToken requestToken = null; try { InputStream in = openFileInput("RequestToken"); ObjectInputStream ois = new ObjectInputStream(in); requestToken = (RequestToken)ois.readObject(); } catch (Exception e) { result += e.getMessage() + DNL; e.printStackTrace(); } String access_token = uri.getQueryParameter("oauth_verifier"); try { accessToken = twitter.getOAuthAccessToken(requestToken, access_token); initializeTwitter(accessToken); // ここでAccessTokenを保存しておけば次回から認証不要となる textView.setText("認証完了"); } catch (TwitterException e) { result += e.getMessage() + DNL; e.printStackTrace(); } } } }
- コールバックURLを使って、ブラウザでの認証後にAndroidアプリを起動させる(124行目)
- 認証後、AccessTokenを生成するため、RequestTokenを保存しておく(131行目〜)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.atwitter" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <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="testapp" android:host="atwitter" android:path="/"/> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="4" /> <uses-permission android:name="android.permission.INTERNET"></uses-permission> </manifest>24行目でuses-permissionを使ってINTERNETを許可しています。あと、17行目でコールバックURLをフックしています。
main.xml(layout)
<?xml version="1.0" encoding="utf-8"?> <FrameLayout android:id="@+id/FrameLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@+id/TextView01" android:layout_height="fill_parent" android:layout_width="fill_parent" android:text="Hello, twitter!"></TextView> <LinearLayout android:id="@+id/LinearLayout01" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_width="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="認証" android:id="@+id/Auth"></Button> <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="タイムラインとか"></Button> </LinearLayout> </FrameLayout>特別なことは何も。
実行例です。認証画面に遷移したところ。