Facebook android SDK图形请求 - 访问令牌问题

时间:2014-05-07 17:06:45

标签: java android facebook api facebook-graph-api

我是facebook SDK的新手,我遇到了这个问题:登录后我有了Session对象,我想执行一些图形API请求。这是我的代码:

Request request = new Request(session, "me?fields=email,installed,first_name,last_name");
Response response = request.executeAndWait();
GraphObject obj = response.getGraphObject();
JSONObject json = obj.getInnerJSONObject();

以下是Request对象(toString()):

{Request:  session: {Session state:OPENED, token:{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[public_profile, email, contact_email, user_hometown]}, appId:MY_APP_ID}, graphPath: me?fields=email,installed,first_name,last_name, graphObject: null, restMethod: null, httpMethod: GET, parameters: Bundle[{access_token=ACCESS_TOKEN_STRING_OF_SESSION, format=json, sdk=android}]}

这是Response对象(toString()):

{Response:  responseCode: 400, graphObject: null, error: {HttpStatus: 400, errorCode: 2500, errorType: OAuthException, errorMessage: An active access token must be used to query information about the current user.}, isFromCache:false}

当我在浏览器中执行请求时,如下所示:

https://graph.facebook.com/v2.0/me?access_token=ACCESS_TOKEN_STRING_OF_SESSION

我收到了有效的json回复。

所以我在响应中看到了这个错误,为什么会这样?使用Request对象,每件事情都可以。

由于

4 个答案:

答案 0 :(得分:4)

好的,这是适用于我的解决方案:

Bundle bundle = new Bundle();
bundle.putString("fields", "email,installed,first_name,last_name");
Request request = new Request(session, "me", bundle, HttpMethod.GET);
Response response = request.executeAndWait();
GraphObject obj = response.getGraphObject();
JSONObject json = obj.getInnerJSONObject();

我没有找到关于此类API调用的任何文档。

答案 1 :(得分:2)

使用bundle参数尝试@vileo解决方案后:

Bundle params = new Bundle();
params.putString("fields", "id,name,icon,administrator");
params.putString("icon_size", "34");
// Put the access token in it
params.putString("access_token", Session.getActiveSession().getAccessToken());

并从中删除以下所有字段:

me/groups?fields=id,name,icon,administrator&icon_size=34

对此:

/me/groups

用这个来做请求:

Bundle params = new Bundle();
params.putString("fields", "id,name,icon,administrator");
params.putString("icon_size", "34");
new Request(
    Session.getActiveSession(),
    "/me/groups",
    params,
    HttpMethod.GET,
    new Request.Callback() {
        public void onCompleted(Response response) {
            if (response.getError() != null) {
                LogUtils.LOGE(TAG, "@ Request user_group failed: " + response.getError().getErrorMessage());

            } else {

                GraphObject go = response.getGraphObject();
                UserGroup userGroup =
                        new Gson().fromJson(go.getInnerJSONObject().toString(), UserGroup.class);

                LogUtils.LOGD(TAG, "Group string::: " + go.getInnerJSONObject().toString());
                if (userGroup != null) {
                    PrefUtils.setFbUserGroup(activity, userGroup);
                }
            }
        }
    }
).executeAsync();    

最后我收到了正确答案......

Group string::: {"data":[{"id":"258966464271933","icon":"https:\/\/fbstatic-a.akamaihd.net\/rsrc.php\/v2\/yH\/r\/k5fKtX9s4PO.png","name":"[咪04] 人才許願池(徵才\/求職\/接案\/發案\/合作)"},{"id":"197223143437","icon":"https:\/\/fbstatic-a.akamaihd.net\/rsrc.php\/v2\/y5\/r\/La_vzova_d2.png","name":"Python Taiwan"},{"id":"262800543746083","icon":"https:\/\/fbstatic-a.akamaihd.net\/rsrc.php\/v2\/yf\/r\/tDvnAIzL8Ft.png","name":"node.js台灣"},...}}

我很好奇为什么FB不提这个让我们猜测......

答案 2 :(得分:1)

Vlio20,我遇到了同样的问题,谢谢你发布你的解决方案;有效。我决定发布这个,因为没有解释新Facebook查询的一般格式。

LoginManager.getInstance().registerCallback(callbackManager,
    new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        /* make the API calls */
                        Bundle myBundle = new Bundle();
                        myBundle.putString("fields" , "id,name,picture,friends{id,name,picture}");
                        new GraphRequest(
                                loginResult.getAccessToken(),
                                "/me",
                                myBundle,
                                HttpMethod.GET,
                                new GraphRequest.Callback() {
                                    public void onCompleted(GraphResponse response) {
                                        /* handle the result */
                                        if (response.getError() != null) {
                                            // handle error
                                            System.out.println("ERROR");
                                        } else {
                                            System.out.println("Success");
                                        }
                                    }
                                }
                        ).executeAsync();
                    }

                    @Override
                    public void onCancel() {
                        // App code
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        // App code
                    }
          });

这将获取用户的公开Facebook个人资料,并获取用户的应用内朋友列表。

如果您需要更深入一个路径级别,只需使用路径的本地名称即可。例如,如果你的基本路径是“/ me”,你可以在路径中更深入一级,在捆绑字符串中输入“friends”以及括号内所需的那些朋友的任何属性“{id,name,图片}”。

这样您就不需要两次调用来从Facebook获取信息:)

答案 3 :(得分:0)

似乎您的请求缺少访问令牌,并且您必须拥有用户访问令牌才能阅读有关人员的信息。

开始使用Android登录Android:

https://developers.facebook.com/docs/android/login-with-facebook/v2.0

调试此类/类似问题的另一个好方法是在shell中使用curl - 您可以在此处获取与curl一起使用的访问令牌:

https://developers.facebook.com/tools/access_token/