2011年3月9日水曜日

Twitter4jでxAuth認証

実際にActivityに書いて認証を呼び出すコードを。

めんどくさいので、TwitterWrapperというクラスを作りました。
設定値は、Valuesというクラスに入れてあります。(手抜き

ステップは4つ
1)twitter4jのjarファイルをビルドパスに追加。
2)設定用のValuesクラスを用意。
3)TwitterWrapperを用意。
4)Activityにメソッドを記述。

1)twitter4jのjarファイルをビルドパスに追加。
これは適当にどこか見てみてください。
こことか。JavaでTwitterをOAuth認証して使えるTwitter4jとは

Versionは、twitter4j-android-2.2.1-SNAPSHOT.zip を使用しました。
他必要なライブラリは、oauth-signpost で、signpost-commonshttp4-1.2.1.1.jar とsignpost-core-1.2.1.1.jarです。

2)設定用のValuesクラスを用意。
設定用のValuesクラス
public class Values {

 public static final String TWITTER_SCREEN_NAME = "じぶんのアカウント";
 
 public static final String TWITTER_CONSUMER_KEY = "自分のConsumerKey";
 public static final String TWITTER_CONSUMER_SECRET = "自分のConsumerSecret";
 public static final String TWITTER_ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token";
 public static final String TWITTER_AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize";
 public static final String TWITTER_CALLBACK_URL = "http://てけとうに自分のサイト/";
 public static final String TWITTER_PREFERENCE_NAME = "おすきに";
 
 public static final String TWITTER_ID_KEY = "screen_name";
 public static final String TWITTER_TOKEN_KEY = "token";
 public static final String TWITTER_TOKEN_SECRET_KEY = "tokenSecret";
 
 public static final String TWITTER_ACCESS_TOKEN_KEY = "accessToken";
 
}

3)TwitterWrapperを用意。


インポート文
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Tweet;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.http.AccessToken;
import twitter4j.http.OAuthAuthorization;
import java.util.List;
import android.app.Activity;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.EditText;

// リソースファイルがわり。
import jp.mediba.android.util.Values;

クラス
public class TwitterWrapper {
    Twitter twitter;
 
    public TwitterWrapper() {
        // do nothing
    }

    public TwitterWrapper(Twitter twitter) {
        this.twitter = twitter;
    }
 
    public Twitter getTwitter() {
        return twitter;
    }

    public void setTwitter(Twitter twitter) {
        this.twitter = twitter;
    }
 
    /**
     * Usage: java twitter4j.examples.search.SearchTweets [query]
     */
    public List<tweet> searchTweet() {
        String str = Values.TWITTER_HASHTAG;
        Twitter twitter = new TwitterFactory().getInstance();
        try {
            Query query = new Query(str);
            query.setRpp(30);
            QueryResult result = twitter.search(query);
            List<tweet> tweets = result.getTweets();
            return tweets;
        } catch (TwitterException te) {
            te.printStackTrace();
            Log.w("TWT", "Failed to search tweets: " + te.getMessage());
        }
        return null;
    }
    
    public void authorization(Activity act) throws TwitterException {
     
        ConfigurationBuilder builder =
                new ConfigurationBuilder();
        builder.setOAuthConsumerKey(Values.TWITTER_CONSUMER_KEY);
        builder.setOAuthConsumerSecret(Values.TWITTER_CONSUMER_SECRET);
        TwitterFactory factory = new TwitterFactory(builder.build());
        String screen_name = 
                ((EditText)act.findViewById(R.id.txtScreenName)).getText().toString();
        String password = 
                ((EditText)act.findViewById(R.id.txtPassword)).getText().toString();
        Twitter twitter = factory.getInstance(screen_name,password);
        AccessToken accessToken = null;
        try {
            accessToken = twitter.getOAuthAccessToken();
            String token = accessToken.getToken();
            String tokenSecret = accessToken.getTokenSecret();
            SharedPreferences pref = 
                act.getSharedPreferences(
                    Values.TWITTER_PREFERENCE_NAME,
                    Activity.MODE_PRIVATE);
            SharedPreferences.Editor editor = pref.edit();
            editor.putString(Values.TWITTER_TOKEN_KEY,token);
            editor.putString(Values.TWITTER_TOKEN_SECRET_KEY,tokenSecret);
            editor.putString(Values.TWITTER_ID_KEY,screen_name);
            editor.commit();
        } catch (TwitterException e) {
            e.printStackTrace();
            throw e;
        }
  
    }

    
    public Twitter getAuthorizedTwitter(Activity act) {
        SharedPreferences settings = 
            act.getSharedPreferences(Values.TWITTER_PREFERENCE_NAME, 0);
        String token = settings.getString(Values.TWITTER_TOKEN_KEY,"NONE");
        String tokenSecret = settings.getString(Values.TWITTER_TOKEN_SECRET_KEY,"NONE");
     
        Twitter twitter = new TwitterFactory().getInstance();
        if(twitter.getAuthorization().isEnabled()){
            return twitter;
        } else {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(Values.TWITTER_CONSUMER_KEY);
            builder.setOAuthConsumerSecret(Values.TWITTER_CONSUMER_SECRET);
            builder.setOAuthAccessToken(token);
            builder.setOAuthAccessTokenSecret(tokenSecret);
            Configuration configuration = builder.build();

            TwitterFactory factory = new TwitterFactory();
            try {
                twitter = factory.getInstance(new OAuthAuthorization(configuration));
            } catch (java.lang.StringIndexOutOfBoundsException e) {
                return null;
            }
         
            if(twitter.getAuthorization().isEnabled()){
                return twitter;
            } else {
                return null;
            }
        }
    }
}

4)Activityにメソッドを記述。

Activityに以下のメソッドを書きます。

インポート文
import twitter4j.TwitterException;
import jp.mediba.android.util.TwitterWrapper;

Activityに以下のメソッドを書き、ボタンに結びつけます。

public void pushAuth(View v) {
        TwitterWrapper tw = new TwitterWrapper();
        AlertDialog.Builder abuilder = new AlertDialog.Builder(this);
        try {
         // ActivityそのものをTwitterWrapperに渡しています。
   tw.authorization(this);
   // 設定が完了したら、ダイアログを出す。
   abuilder.setMessage( R.string.dialog_api_twitter_setting_done_title )
          .setCancelable(false)
          .setPositiveButton( R.string.ok, new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int id) {
               dialog.cancel();
               // ダイアログのOKをおしたら、別画面に遷移。
               goTweet();
              }
          });
   
  } catch (TwitterException e) {
   e.printStackTrace();
   // なんかエラーが起きたら、ダイアログを出す。
   abuilder.setMessage( R.string.error_api_twitter_login )
         .setCancelable(false)
         .setPositiveButton( R.string.ok, new DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int id) {
              dialog.cancel();
             }
         });
  
  }
  AlertDialog alert = abuilder.create();
  alert.show();
    }
    
    // 遷移したいActivityをセットして、画面遷移するロジックは外出ししておく。
    public void goTweet() {
     Intent intent = new Intent(this, ActTweet.class);
     startActivity(intent);
     finish();
    }