我是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对象,每件事情都可以。
由于
答案 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一起使用的访问令牌: