Android 版 SDK 支持与 Facebook 图谱 API 集成。通过 GraphRequest
和 GraphResponse
类,您可以在 JSON 内发出请求并获得响应(两者异步进行)。您还可以通过 GraphRequestBatch
向 Facebook 服务器发送单个往返行程的批量请求。
如需详细了解图谱 API,请阅读以下文档:
另外,请参阅 GraphRequest
、GraphResponse
和 GraphRequestBatch
参考文档,了解使用 Android 版 Facebook SDK 的方法和调用图谱 API 的更多实例。
GraphRequest
类GraphRequest
类有一个 newMeRequest
方法,此方法会调用 /user/me 端点,获取特定访问口令的用户数据。
Android SDK 会在 access_token
内发送您的应用拥有的所有权限,这会控制数据访问权限。如果您的应用没有可用的访问口令,图谱 API 就只会返回用户的公开信息。如需了解有关 User
属性和权限的详细信息,请参阅图谱 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 登录。
您可以访问的数据取决于用户授予您应用的权限,以及用户选择与应用分享的数据。以下是图谱 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
如需详细了解可能出现的错误代码,请参阅“使用图谱 API”的“错误处理”部分。
此外,GraphResponse
对象还有一个 enum
,可以对错误进行分类。三种可能的类别是:
LOGIN_RECOVERABLE
— 出现需要用户重新登录的问题。您可以通过 GraphResponse
对象和应用的活动或片段,调用 LoginManager
的 resolveError
。这将触发 Faceboook 登录界面,您需要通过发起调用的片段或活动来实施 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
— 图谱 API 用户参考文档GraphRequestBatch
— GraphRequestBatch
参考文档 GraphRequest
— GraphRequest
参考文档