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