* Google Android WebAPIプログラミング入門を読んでいて [#k697e550] ** 第9章 「もう少し実用的なクライアントを目指す」のアプリが動かねー [#z13d08c3] 「Google Android WebAPIプログラミング入門」(横山隆司著)の第9章の「9-4 もう少し実用的なクライアントを目指す」で、本の通りにコーディングしても、Facebookクライアントがニュースフィードを取得できません。下記の問題点があります。多分、本執筆後、APIに変更があって、アプリが正常動作しなくなったのでしょう。順を追って解決していきます。 *** 1. logcatにorg.json.JSONException: No value for dataが出る [#f235c736] FacebookHomeFactory.javaの > JSONArray dataArray = rootObject.getJSONArray("data"); で、org.json.JSONException: No value for dataになっています。このコードの前辺りに、 > Log.i("TAG", "response = " + response); > Log.i("TAG, "rootObject = " + rootObject); を書いて、実行すると、logcatに > I/TAG ( 436): response = {"error":{"message":"(#200) Requires extended permission: read_stream","type":"OAuthException"}} > I/TAG ( 436): rootObject = {"error":{"type":"OAuthException","message":"(#200) Requires extended permission: read_stream"}} と出力されます。ググると、http://facebook-docs.oklahome.net/archives/51892628.htmlとかが引っかかり、MainActivity.javaの > mFacebook.authorize(this, new DialogListener() { を > mFacebook.authorize(this, new String[] {"read_stream"}, new DialogListener() { と書き換え、アプリユーザに追加のパーミッションread_streamを求めるように設定するといい。 *** 2. logcatにまたまた org.json.JSONException: No value for data が出る。 [#jea45ebc] エラーが出ている行番号を見ると、FacebookHomeFactory.javaのif(data.has("comments"))文内の エラーが出ている行番号を見ると、FacebookHomeFactory.javaのif(data.has("comments"))ブロック内の > JSONArray array = res_comments.getJSONArray("data"); でエラーが発生していることが分かります。この文の前辺りに、 > Log.i("TAG", "res_comments = " + res_comments); を書いて実行すると、 > I/TAG ( 1321): res_comments = {"count":0} が出力されます。コメントがなく、"data"のJSONArrayが取れないということです。これは、 > int count = res_comments.getInt("count"); の文を前に書いて、 > JSONArray array = res_comments.getJSONArray("data"); の行から、 > comments_array.add(comments_data); の行まで行を、if (count != 0) ブロックの中に入れれば解決します。 *** 3. logcatに org.json.JSONException: No value for message が出る。 [#z438f1f9] logcatの出力を見ると、 > news.setMessage(Uri.decode(data.getString("message"))); の行でエラーが出ています。ニュースフィードにメッセージがないとき、エラーがでるようなので、 > String message = ""; > try { > message = data.getString("message"); > news.setMessage(Uri.decode(data.getString("message"))); > } catch (JSONException je2) { > news.setMessage(message); } と書き換えると、問題は解消されます。 *** 4. Androidキーハッシュを開発者ページで登録する必要がある? [#k69a1a14] これは、アプリが動かないとき、真っ先にやったことで、必須か分かりません。http://ayakix-lablog.blogspot.com/2011/08/facebookandroid.htmlなどを見てキーハッシュを作成し、開発ページに登録しましょう。