* 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などを見てキーハッシュを作成し、開発ページに登録しましょう。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS