任意の文字列をポストするだけの簡単なAndroidクライアントを作成した

環境

Android API level 9
twitter4j for Android 2.2.3

コード

Skz_protoActivity.java
package net.mogera

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Skz_protoActivity extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //layoutをセット
    setContentView(R.layout.main);

    //クリックリスナーを貼る
    Button sendTweet = (Button) findViewById(R.id.sendtweet);
    sendTweet.setOnClickListener(new SendTweet());
  }

  public class SendTweet implements OnClickListener {
    //このonClickはEclipseが保管してくれる
    @Override
    public void onClick(View v) {
      //テキストを取得して文字列にして保存
      EditText updatetext= (EditText) findViewById(R.id.tweettext);
      String updatetextstr = updatetext.getText().toString();

      //各 OAuth キー
      //各キーについてはtwitterのdevページで入手
      String consumer_key = "your keys";
      String consumer_seclet = "your keys";
      String accsess_token = "your keys";
      String accsess_token_seclet = "your keys";

      //Twitter4j を使い初期化
      Twitter twitter = new TwitterFactory().getInstance();
      //コンシューマーキーをセット()
      twitter.setOAuthConsumer(consumer_key, consumer_seclet);
      //アクセストークンをセット
      twitter.setOAuthAccessToken(new AccessToken(accsess_token,
          accsess_token_seclet));

      //Toastでポップアップして確認
      Toast.makeText(Skz_protoActivity.this, updatetextstr + "を送信できるかなぁ……",
          Toast.LENGTH_SHORT).show();
      try {
        //ツイートの送信
        twitter.updateStatus(updatetextstr);
        Toast.makeText(Skz_protoActivity.this, "送信したかも!",
            Toast.LENGTH_SHORT).show();
      } catch (TwitterException e) {
        Toast.makeText(Skz_protoActivity.this, "送信できてないかも……",
            Toast.LENGTH_SHORT).show();
        //てきとーにエラーメッセージをポップアップさせる(logの使い方知らないだけです)
        Toast.makeText(Skz_protoActivity.this, e.getErrorMessage(),
            Toast.LENGTH_LONG).show();
        Toast.makeText(Skz_protoActivity.this, e.getMessage(),
            Toast.LENGTH_LONG).show();
        e.printStackTrace();
      }
    }
  }
}

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <TextView android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:text="@string/hello" />
  <TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="Skz_proto"
    android:id="@+id/textView1" android:textAppearance="?android:attr/textAppearanceLarge"></TextView>
  <EditText android:layout_width="match_parent"
    android:layout_height="wrap_content" android:id="@+id/tweettext">
    <requestFocus></requestFocus>
  </EditText>
  <Button android:text="そうしんっ!" android:id="@+id/sendtweet"
    android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>

ハマりどころ

twitter.updateStatus(str);

で落ちているのはわかっていたけどどうしてcatchされているのかわからなかった。なぜかTwitterのOAuthのAccess TokenがRead-Onlyになってたりして401エラーができた。てきとーにエラーメッセージを吐かせてやっと気づいた。

課題

オレオレ用クライアントとしてはいちおう形にはなっているのだけど、AccessTokenとかをオレオレ専用にしているので配布ができない。OAuthに対応させた配布できるようなクライアントをつくるのが目標。

追記

リポジトリは github に