Android SDK 支援 Facebook Graph API 整合。透過 GraphRequest
和 GraphResponse
類別,您能夠以非同步處理的方式,使用 JSON 格式做出要求與取得回應。透過 GraphRequestBatch
,您還能夠在與 Facebook 伺服器的單次往返中完成批次要求。
進一步瞭解 Graph API:
另請參閱 GraphRequest
、GraphResponse
和 GraphRequestBatch
參考資料,瞭解如何於其他使用案例中使用 Facebook Android SDK 與呼叫 Graph API。
GraphRequest
類別GraphRequest
類別的 newMeRequest
方法會呼叫 /user/me 端點,擷取指定存取權杖的用戶資料。
Android SDK 會透過 access_token
傳送您的應用程式所具備的所有權限,並以此控制資料存取。如果您的應用程式無存取權杖可用,則 Graph API 僅會傳回公開可用資訊。如需有關 User
屬性和權限的詳細資訊,請參閱「Graph API 參考資料」中的「User
」。
根據預設,newMeRequest
方法會從 User 物件擷取預設欄位。如果您需要其他任何欄位,或為了提升效能而想要降低回應承載,可加入 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 登入。
您可存取的資料取決於用戶授與應用程式的權限,以及用戶選擇與應用程式分享的資料。以下範例為 Graph API 對於 user_location
和 user_birthday
的原始回應:
{ "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
欄位。三種可能的分類如下:
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
的參考資料