AndroidでFacebookのウォール情報を取得する
|以前、AndroidでFacebookのウォールに投稿を行うにて、AndroidからFacebookに投稿を行う方法について解説しました。
今回は、Facebookのウォールの情報を取得してみたいと思います。
今回解説に使用するアプリでは、Wallボタンを押下することでFacebookのAPIを用いてウォールの情報を取得し、取得した情報を解析してメッセージ部分を取り出してリスト形式で並べてみます。
ポイントは、
・ AsyncFacebookRunnerクラスのrequest()メソッドを用いてウォールの情報を取得する
・取得したJSON形式の情報を解析して表示したい情報を抜き出す。
の2点です。
それでは続きで詳しく見ていきましょう。
ウォールのデータを取得するためのリクエスト
まずは自分のウォールの情報を取得します。
ウォールの情報を取得するには、AsyncFacebookRunnerクラスのrequest()メソッドを利用します。
AndroidでFacebookのウォールに投稿を行うでは、同じくrequest()メソッドを用いて投稿を行いましたが、今回はそのオーバーロードメソッドを用います。
ソースコードを見てみましょう。
WallActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | public class WallActivity extends ListActivity { private static final String ApiKey = "<API Key>" ; private Facebook facebook = null ; private AsyncFacebookRunner asyncFbRunner = null ; private JSONObject jObj = null ; private ArrayList msgList = new ArrayList(); @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.list_item); facebook = new Facebook(ApiKey); asyncFbRunner = new AsyncFacebookRunner(facebook); final Intent intent = new Intent( this ,WallListActivity. class ); facebook.authorize(WallActivity. this , new String[] { "publish_stream" }, new DialogListener(){ @Override public void onComplete(Bundle values) { Toast.makeText(WallActivity. this , "onComplete!" , Toast.LENGTH_SHORT).show(); Log.d( "SeitDebug" , "onComplete!" ); asyncFbRunner.request( "me/feed" , new PostRequestListener(){ @Override public void onComplete(String response, Object state) { // requestに対してresponseが返された場合に呼ばれる (...後述...) } }); } (...省略...) }); } @Override public void onActivityResult( int requestCode, int resultCode, Intent data) { super .onActivityResult(requestCode, resultCode, data); // Facebook公式アプリをインストールしている場合こちらに飛んでくる facebook.authorizeCallback(requestCode, resultCode, data); } } |
Facebookクラスのauthorize()メソッドについては、 AndroidでFacebookのウォールに投稿を行うでも解説してますので今回は省略します。
今回のポイントは、24行目AsyncFacebookRunnerクラスのrequest()メソッドを使用している部分です。
第1引数で、ウォールを取得するGraph APIにアクセスするためのURL(https://graph.facebook.com/以降)として”me/feed”を指定しています。
第2引数には、AsyncFacebookRunnerクラスのRequestListener()インターフェースをimplementsしたPostRequestListenerクラスのインスタンスを指定しています(PostRequestListenerクラスについては、ソースコードを AndroidでFacebookのウォールに投稿を行うに記述していますので、そちらを参考にしてください)。
さて、これでデータを取得するためのリクエストは実装できました。
取得したデータを解析する
データを取得するためのリクエストは先ほど実装できたので、次はレスポンスからデータを取り出して解析したいと思います。
AsyncFacebookRunnerクラスのrequest()メソッドによるリクエストに成功すると、onActivityResult()メソッドを経由してonComplete()メソッドの処理が実行されます。
前述のWallActivity.javaのソースコードで、21行目のonComplete()メソッド内の処理を以下に記述します。
WallActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Override public void onComplete(String response, Object state) { // requestに対してresponseが返された場合に呼ばれる try { jObj = new JSONObject(response); JSONArray dataArray = jObj.getJSONArray( "data" ); for ( int i= 0 ; i < dataArray.length(); i++) { JSONObject obj = dataArray.getJSONObject(i); if (obj.has( "message" )){ msgList.add(obj.getString( "message" ) + "\n" ); } } intent.putStringArrayListExtra( "msgList" ,msgList); startActivity(intent); } catch (Exception e){ Log.d( "seit" ,e.getMessage()); } } |
5行目で、レスポンスからJSON形式で渡されてくるウォールの情報を取り出しています。
あとは8行目〜13行目で、取り出したJSONをひたすら解析して欲しいデータを抽出しています(今回取得したJSONについては後ほど記載)。
JSONの解析方法については、以下の記事を参考にしています。
6行目でキー”data”に割り当てられた値を、JSONArrayクラスのインスタンスとして取得しています。
8行目のループ内で、JSONArray型のオブジェクトから値を順番に、JSONObjectクラスのインスタンスとして取り出しています。
10行目で、JSONObject型のオブジェクトの中に、キー”message”で割り当てられた値があった場合、それを取り出してArrayListクラスの配列に詰め込んでいきます。
ループを抜けたら、14行目でIntentに作成した配列を付加し、15行目で別画面を呼び出しています。
あとは呼び出された側の画面で、渡され得てきた配列をListViewに表示すると、下図のようにメッセージが一覧で表示されます。
ちなみに今回のサンプルでは、以下のようなJSONを取得できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | { "data" :[ { "id" : "1006789896764_89678609870" , "story" : "piyo and hoge fuga are now friends." , "story_tags" :{ "10" :[{ ".." , ".." }], "0" :[{ "..." , "..." }] }, "from" :{ "id" : "104567864" , "name" : "hoge fuga" }, "created_time" : "2012-05-15T13:13:51+0000" , "type" : "status" , "updated_time" : "2012-05-15T13:13:51+0000" , "comments" :{ "count" : 0 } }, { "icon" : "http:\/\/www.facebook.com\/images\/icons\/mobile_app.gif" , "application" :{ "id" : "7656789" , "name" : "Facebook for Android" }, "link" : "http:.....html" , "caption" : "www....co.jp" , "from" :{ "id" : "4567987654" , "name" : "hoge fuga" }, "type" : "link" , "updated_time" : "2012-05-17T14:00:23+0000" , "picture" : "https:\/\/www.facebook.com\/app_full_pro...." , "message" : "このお菓子バカ美味。今度京都行ったら買って帰ろう。" , "id" : "3456787654567_3456765456" , "likes" :{ "count" : 3 , "data" :[{....}] }, "name" : "京ちゃふれ" , "created_time" : "2012-05-15T06:31:14+0000" , "comments" :{ "count" : 2 , "data" :[{...}] } }, { (...繰り返し省略...) } } |
今回は27行目にある”message”キーに対応している値をJSON内からすべて抽出しましたが、その他にも様々な情報が格納されていることがわかります。
そしてそれらの情報(画像やリンク、メッセージなど)が、一つの投稿毎に繰り返し格納されています。
自分だけのFacebookアプリを作成してみてはいかがでしょうか。