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