AndroidでTwitterのタイムラインを表示するサンプル

AndroidTwitterのタイムラインを表示します。HttpClientとJSONとWebViewのいい感じのサンプルになっていると思います。


とりあえずこんな画面定義をしてWebViewを配置しておく。

<?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">
    <Button
        android:id="@+id/twit_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="twit"/>
    <WebView
        android:id="@+id/twit_web"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text=""/>
</LinearLayout>


あとはこんな処理を書くとボタンを押したときにTLが読み込まれる。
HTTPClientで認証、接続して、JSONを解釈してWebViewに表示します。
ユーザー名とパスワードは適当に書きかえてください。
ところで、HTMLの最初のほうに変更がないと、loadDataしても画面が更新されないのはなんでなんだぜ?

public class MainActivity extends Activity implements View.OnClickListener {
    /** 画面を更新させるためのカウンター */
    int count = 0;
    /** タイムラインを表示する処理 */
    private void twit() {
        WebView twitview =  (WebView) findViewById(R.id.twit_web);
        try {
            //接続の準備
            DefaultHttpClient http = new DefaultHttpClient();
            HttpGet get = new HttpGet(
                "http://twitter.com/statuses/friends_timeline.json");
            Credentials cred = new UsernamePasswordCredentials(
                "", "");//userとpassを
            http.getCredentialsProvider().setCredentials(
                new AuthScope("twitter.com", 80), cred);
            //接続
            HttpResponse execute = http.execute(get);
            //サーバーからのデータを取得
            InputStream is = execute.getEntity().getContent();
            InputStreamReader isr = new InputStreamReader(is);
            StringWriter sw = new StringWriter();
            BufferedReader buf = new BufferedReader(isr);
            for(String line; (line = buf.readLine()) != null;){
                sw.write(line);
            }
            //出力準備
            StringWriter swout = new StringWriter();
            PrintWriter out = new PrintWriter(swout);
            out.println("<html><head><title>Twit</title></head>");
            ++count;//なぜか先頭に変化がないときはWebViewが更新されない
            out.println("<body><h1>Twitt" + count + "</h1>");
            //JSONデータからタイムラインを取得してHTMLを生成
            JSONTokener token = new JSONTokener(sw.toString());
            JSONArray arr = new JSONArray(token);
            for(int i = 0; i < arr.length(); ++i){
                JSONObject obj = arr.getJSONObject(i);
                JSONObject user = obj.getJSONObject("user");
                out.println("<div style='border-bottom: 1px solid #888888'>");
                out.println("<img style='width:48px; height:48px;' src='" 
                        + user.get("profile_image_url") + "' align='left'>");
                out.println("<bold><font color='#6666ff'>" 
                        + user.getString("screen_name") + "</font></bold><br>" );
                out.println(obj.get("text") + "<br clear='all'>\n");
                out.println("</div>");
            }
            out.println("</body></html>");
            //WebViewに出力
            twitview.loadData(swout.toString(), "text/html", "utf-8");
        } catch (JSONException ex) {
            twitview.loadData("<h1>error</h1>" + ex.getLocalizedMessage(),
                    "text/html", "utf-8");
        } catch (IOException ex) {
            twitview.loadData("<h1>error</h1>" + ex.getLocalizedMessage(),
                    "text/html", "utf-8");
        }

    }

    /** 初期化 */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        setContentView(R.layout.main);

        View twit = findViewById(R.id.twit_button);
        twit.setOnClickListener(this);
    }

    /** ボタンが押されたときの処理 */
    public void onClick(View arg0) {
        switch(arg0.getId()){
            case R.id.twit_button:
                new Thread(){public void run(){ twit(); }}.start();
                break;
        }
    }
}


ネットに接続するので、AndroidManifest.xmlパーミッションの設定を追加する。

 <uses-permission android:name="android.permission.INTERNET"/>


なんか、まっとうなTwitterクライアントみたいで、ついリンクをクリックしてしまう。
WebViewとかMapViewとか使うと、ちゃんとしたアプリケーションを作った気分になれるのでいいですね。