AndroidでFacebookのウォール情報を取得する


以前、AndroidでFacebookのウォールに投稿を行うにて、AndroidからFacebookに投稿を行う方法について解説しました。

今回は、Facebookのウォールの情報を取得してみたいと思います。
今回解説に使用するアプリでは、Wallボタンを押下することでFacebookのAPIを用いてウォールの情報を取得し、取得した情報を解析してメッセージ部分を取り出してリスト形式で並べてみます。

ポイントは、
AsyncFacebookRunnerクラスrequest()メソッドを用いてウォールの情報を取得する
・取得したJSON形式の情報を解析して表示したい情報を抜き出す。
の2点です。

それでは続きで詳しく見ていきましょう。

ウォールのデータを取得するためのリクエスト

まずは自分のウォールの情報を取得します。
ウォールの情報を取得するには、AsyncFacebookRunnerクラスrequest()メソッドを利用します。
AndroidでFacebookのウォールに投稿を行うでは、同じくrequest()メソッドを用いて投稿を行いましたが、今回はそのオーバーロードメソッドを用います。

ソースコードを見てみましょう。
WallActivity.java

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

		        	@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を取得できました。

{"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アプリを作成してみてはいかがでしょうか。