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に保存し、初回アプリ起動時のみ認証(保存されていなければ認証起動)するようにしました。
あと公開予定は無い自分専用なので、アイコンは好き勝手にしました。
権利関係アレですがそういう事なのでごめんなさい。