AndroidでTwitterのタイムラインを表示します。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とか使うと、ちゃんとしたアプリケーションを作った気分になれるのでいいですね。