Android SDKは、Facebook Graph APIとの統合をサポートしています。GraphRequest
クラスやGraphResponse
クラスを使用すると、リクエストの作成やレスポンスの取得をJSON形式で非同期に実行できます。さらに、GraphRequestBatch
を使用すると、Facebookサーバーへの1回のラウンドトリップで、バッチリクエストを行うことができます。
Graph APIの詳細については、次をご覧ください。
Android用Facebook SDKの使用方法と、その他の使用例におけるGraph API呼び出しの作成方法については、GraphRequest
、GraphResponse
、GraphRequestBatch
のリファレンスもご覧ください。
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_location
とuser_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
- 利用者の再ログインが必要になる問題があった場合。LoginManager
のresolveError
を、GraphResponse
オブジェクトとアプリのアクティビティまたはフラグメントとともに呼び出すことができます。これによりFacebookログインUIがトリガーされます。ログインを正しく実行するためのフラグメントまたはアクティビティを呼び出して、CallbackManager
を実装する必要があります。TRANSIENT
- 一時的な問題が発生したことを示します。アプリはリクエストを再実行できます。OTHER
- 一般的な問題が発生したことを示します。error code
とsub error code
を調べることで、詳細を確認できます。ユーザーデータの取得中に問題が発生した場合は、アプリからユーザーデータをリクエストする前に、次のコードを追加してHTTPリクエストのログ記録を有効にします。
FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);
これにより、HTTPリクエストとレスポンスに関する詳細情報がコンソールログにログ記録されます。
アプリで次のような状況を処理する場合は、データのバッチリクエストを行います。
サーバーのラウンドトリップの量を減らす場合は、バッチリクエストを使用します。たとえば、次のようにすると利用者とその友達を取得できます。
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()
を呼び出します。
User
- Graph APIユーザーリファレンスGraphRequestBatch
- GraphRequestBatch
のリファレンス GraphRequest
- GraphRequest
のリファレンス