主にandroidとかのメモ

twitter4jでツイートする

twitter4jの実験。

総合的なtwitterクライアント作れるわけもないので、ツイート部分だけ作りました。

ツイート部分だけとはいえ、ツイートするだけでも先に認証部分を作る必要があります。
OAuth認証部分はadakodaさんの記事を参考にしました。

[Android] Android+Twitter4JでOAuthするためのソースコード

OAuthActivityをそのまま使わせてもらったのですが、自分の環境ではshouldOverrideUrlLoading()が動作しなかった為、onPageStarted()に書き換えました。

public void onPageStarted(WebView view, String url, Bitmap favicon)
に書き換えて、returnを削除(返り値の型がvoidなので)しただけです。

次にtwitterアプリ登録をしておきます。
twitterにログインして、設定→アプリ連携→開発者で登録。

Application Details:ツイートしたときに出るクライアント名。(表示されるかはクライアントによる)
Description:認証画面で表示されます。まずは適当で。
WebSite:そのアプリの紹介ページとかを登録しておきます。

Application Icon:アイコンです。JPG/GIF/PNGで700kBまで。認証画面で表示されますが、まずは無くてもいいです。

Application Type:アクセス権限です。認証画面で表示されますし、アプリで使用できるAPIに制限が出ます。今回はツイートしたいのでRead and Writeに設定。

Call backURL:認証後にリダイレクトされるURLです。自分のWebページを設定。一瞬見えるので「認証完了しました」とか表示させると良いかも(最悪Yahooとか何のURLでも良いです)
※本来Webサービス(OAuthConsumer)が、Twitter.com(OAuthProvider)からこのURLにアクセスされ、認証結果を受け取る事で認証OK/NGを把握するけど、今回はandroid側で遷移したURL一致を見て判断していますので一致していれば動きます

ここまで準備すればあとは、
①アプリ登録情報(Consumer keyとConsumer secret)で認証を呼び出す
②取得した認証データ(tokenとtoken_secret)を使ってツイート
するだけ。

結果こんなソースになりました。
CALLBACK、CONSUMER_KEY、CONSUMER_SECRETは消してあります。
(それぞれtwitterアプリ設定画面を確認して入力してください)

 package net.init0.android.twittertest;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class TwitterTestActivity extends Activity implements OnClickListener{
	private static final String CALLBACK = "[twitterアプリ登録ページで登録したURL]";
	private static final String CONSUMER_KEY = "[twitterアプリ登録ページに表示されるConsumer key]";
	private static final String CONSUMER_SECRET = "[twitterアプリ登録ページに表示されるConsumer secret]";

	private static final int REQUEST_OAUTH=0;

	private static long user_id=0L;
	private static String screen_name=null;
	private static String token=null;
	private static String token_secret=null;
	
	Button btn=null;
	TextView editText=null;

	//OAuthデータ保存用
	SharedPreferences pref;
    SharedPreferences.Editor editor;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button) this.findViewById(R.id.button1);
        btn.setOnClickListener(this);
        editText = (TextView) this.findViewById(R.id.editText3);
        
        //OAuth認証データ読み込み
        pref = getSharedPreferences("t4jdata", Activity.MODE_PRIVATE);
        token=pref.getString("token", "");
        token_secret=pref.getString("token_secret", "");

        //OAuthデータ無し時認証起動
        if(token.length()==0){
        Intent intent = new Intent(this, OAuthActivity.class);
        intent.putExtra(OAuthActivity.CALLBACK, CALLBACK);
        intent.putExtra(OAuthActivity.CONSUMER_KEY, CONSUMER_KEY);
        intent.putExtra(OAuthActivity.CONSUMER_SECRET, CONSUMER_SECRET);
        startActivityForResult(intent, REQUEST_OAUTH);
        }
        
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
		// OAuth完了
		if (requestCode == REQUEST_OAUTH && resultCode == RESULT_OK) {
			user_id=intent.getLongExtra(OAuthActivity.USER_ID, 0L);
			screen_name=intent.getStringExtra(OAuthActivity.SCREEN_NAME);
			token=intent.getStringExtra(OAuthActivity.TOKEN);
			token_secret=intent.getStringExtra(OAuthActivity.TOKEN_SECRET);
			
			TextView mTextView = (TextView) this.findViewById(R.id.textView1);
			mTextView.setText(token_secret);
			
			//認証データ保存
			editor = pref.edit();
			editor.putString("token",token);
			editor.putString("token_secret",token_secret);
			editor.commit(); 
		}
    }


    @Override
    public void onClick(View arg0) {
        AccessToken accessToken=new AccessToken(token,token_secret);

	Configuration conf = getConfiguration();
        TwitterFactory twitterfactory = new TwitterFactory(conf);

	Twitter twitter = twitterfactory.getInstance(accessToken);

	Status status = null;
	try {
	    status = twitter.updateStatus( editText.getText().toString());
	} catch (TwitterException e) {
	    // TODO 自動生成された catch ブロック
	    e.printStackTrace();
	}
	editText.setText("");
    }
    
    private static Configuration getConfiguration() {
        ConfigurationBuilder confbuilder = new ConfigurationBuilder();
        confbuilder.setOAuthConsumerKey(CONSUMER_KEY);
        confbuilder.setOAuthConsumerSecret(CONSUMER_SECRET);
        return confbuilder.build();
    }    
    
}

tokenとtoken_secretは使いまわせるようなのでSharedPrefernceに保存し、初回アプリ起動時のみ認証(保存されていなければ認証起動)するようにしました。

あと公開予定は無い自分専用なので、アイコンは好き勝手にしました。
権利関係アレですがそういう事なのでごめんなさい。

認証画面

ツイート画面

他のtwitterクライアント(twicca)で見たところ