使用图谱 API — Android

Android 版 SDK 支持与 Facebook 图谱 API 集成。通过 GraphRequestGraphResponse 类,您可以在 JSON 内发出请求并获得响应(两者异步进行)。您还可以通过 GraphRequestBatch 向 Facebook 服务器发送单个往返行程的批量请求。

如需详细了解图谱 API,请阅读以下文档:

另外,请参阅 GraphRequestGraphResponseGraphRequestBatch 参考文档,了解使用 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 有 ProfileProfileTracker 类,具体请参阅 Android 版 Facebook 登录

获取用户数据

您可以访问的数据取决于用户授予您应用的权限,以及用户选择与应用分享的数据。以下是图谱 API 对 user_locationuser_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 对象和应用的活动或片段,调用 LoginManagerresolveError。这将触发 Faceboook 登录界面,您需要通过发起调用的片段或活动来实施 CallbackManager,才能成功登录。
  • TRANSIENT — 表示出现临时问题,且您的应用可以重试请求。
  • OTHER — 表示出现常规问题,检查 error codesub 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()

相关资源