Graph APIの使用 - Android

Android SDKは、Facebook Graph APIとの統合をサポートしています。GraphRequestクラスやGraphResponseクラスを使用すると、リクエストの作成やレスポンスの取得をJSON形式で非同期に実行できます。さらに、GraphRequestBatchを使用すると、Facebookサーバーへの1回のラウンドトリップで、バッチリクエストを行うことができます。

Graph APIの詳細については、次をご覧ください。

Android用Facebook SDKの使用方法と、その他の使用例におけるGraph API呼び出しの作成方法については、GraphRequestGraphResponseGraphRequestBatchのリファレンスもご覧ください。

前提条件

開始する前に、次をセットアップします。

GraphRequestクラス

GraphRequestにはnewMeRequestメソッドがあります。これは、/user/meのエンドポイントを呼び出し、特定のアクセストークンのユーザーデータを取得します。

Android SDKはアプリが持つアクセス許可をaccess_tokenで送信し、これがデータアクセスを制御します。アプリが利用できるアクセストークンがない場合は、Graph APIは公開されている情報のみを返します。Userプロパティとアクセス許可に関する詳細については、「Graph APIリファレンス」の「Userをご覧ください。

デフォルトでは、newMeRequestメソッドによってユーザーオブジェクトのデフォルトフィールドが取得されます。それ以外のフィールドが必要な場合や、パフォーマンスの理由からレスポンスのペイロードを減らしたい場合は、fieldsパラメータを追加して、特定のフィールドをリクエストします。

GraphRequest request = GraphRequest.newMeRequest(
        accessToken,
        new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(
                   JSONObject object,
                   GraphResponse response) {
                // Application code
            }
        });
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link");
request.setParameters(parameters);
request.executeAsync();

コールバックメソッドでは、リクエストが成功した場合、レスポンスデータがJSONObjectにデシリアライズされます。アクセス許可がないために取得できないフィールドは、結果には含まれません。

ログインしている利用者の場合、SDKではProfileクラスとProfileTrackerクラスを使用できます。詳細については、「Android用Facebookログイン」をご覧ください。

ユーザーデータの取得

アクセスするデータは、アプリおよびそのアプリとシェアするデータに付与されたアクセス権限によって異なります。次は、user_locationuser_birthdayに対するGraph APIのレスポンスの例(未加工)です。

{
  "id": "12345678", 
  "birthday": "1/1/1950", 
  "first_name": "Chris", 
  "gender": "male", 
  "last_name": "Colm", 
  "link": "http://www.facebook.com/12345678", 
  "location": {
    "id": "110843418940484", 
    "name": "Seattle, Washington"
  }, 
  "locale": "en_US", 
  "name": "Chris Colm", 
  "timezone": -8, 
  "updated_time": "2010-01-01T16:40:43+0000", 
  "verified": true
}

結果の処理

呼び出すエンドポイントに応じて、JSONObjectまたはJSONArrayのいずれかを受け取ります。

newMeRequestのような単一のオブジェクト呼び出しの場合は、JSONObjectが返されます。newMyFriendsRequestのように複数の結果を得るための呼び出しでは、JSONArrayが返されます。

エラーの処理

リクエストが失敗したかどうかを確認するには、GraphResponseオブジェクトのエラーフィールドを調べます。エラーフィールドは、FacebookRequestErrorの種類のフィールドです。次のメソッドを呼び出すことができます。

エラーオブジェクトには、次のようなエラーの詳細を説明するフィールドがあります。

  • error code
  • sub error code
  • error message
  • user facing error message
  • その他のメッセージ

想定されるエラーコードの詳細については、「Graph APIの使用」の「エラーの処理」をご覧ください。

さらに、GraphResponseオブジェクトには、エラーをカテゴリに分類するenumがあります。カテゴリには次の3つがあります。

  • LOGIN_RECOVERABLE - 利用者の再ログインが必要になる問題があった場合。LoginManagerresolveErrorを、GraphResponseオブジェクトとアプリのアクティビティまたはフラグメントとともに呼び出すことができます。これによりFacebookログインUIがトリガーされます。ログインを正しく実行するためのフラグメントまたはアクティビティを呼び出して、CallbackManagerを実装する必要があります。
  • TRANSIENT - 一時的な問題が発生したことを示します。アプリはリクエストを再実行できます。
  • OTHER - 一般的な問題が発生したことを示します。error codesub error codeを調べることで、詳細を確認できます。

トラブルシューティング

ユーザーデータの取得中に問題が発生した場合は、アプリからユーザーデータをリクエストする前に、次のコードを追加してHTTPリクエストのログ記録を有効にします。

FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);

これにより、HTTPリクエストとレスポンスに関する詳細情報がコンソールログにログ記録されます。

バッチリクエスト

アプリで次のような状況を処理する場合は、データのバッチリクエストを行います。

  • 1つのリクエストで大量のデータにアクセスする場合
  • 複数のオブジェクトに一度に変更を行う場合

サーバーのラウンドトリップの量を減らす場合は、バッチリクエストを使用します。たとえば、次のようにすると利用者とその友達を取得できます。

GraphRequestBatch batch = new GraphRequestBatch(
        GraphRequest.newMeRequest(
                access_token,
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject jsonObject,
                            GraphResponse response) {
                        // Application code for user
                    }
                }),
        GraphRequest.newMyFriendsRequest(
                access_token,
                new GraphRequest.GraphJSONArrayCallback() {
                    @Override
                    public void onCompleted(
                            JSONArray jsonArray, 
                            GraphResponse response) {
                        // Application code for users friends 
                    }
                })
);
batch.addCallback(new GraphRequestBatch.Callback() {
    @Override
    public void onBatchCompleted(GraphRequestBatch graphRequests) {
        // Application code for when the batch finishes
    }
});
batch.executeAsync();

上の例では、一括リクエストが非同期呼び出しになっています。このコードがバックグラウンドスレッドにあり、呼び出しが完了するまでブロックする場合は、batch.executeAndWait()を呼び出します。

関連リソース