无法从Facebook API获得age_range

时间:2014-03-20 12:29:01

标签: json facebook facebook-graph-api

根据Facebook文档,age_range是请求用户数据时的默认属性: https://developers.facebook.com/docs/facebook-login/permissions#reference-basic-info

当我使用" me "作为具有正确令牌的用户ID:

  所需用户

https://graph.facebook.com/me?fields=id%2Cname%2Cemail%2Cfirst_name%2Clast_name%2Cusername%2Cgender%2Cpicture%2Cage_range&format=json&access_token=[accessToken

{
   "id": "FACEBOOKID",
   "name": "testuser",
   "email": "testuser\u0040test.net",
   "first_name": "testuser",
   "last_name": "testuser",
   "gender": "male",
   "age_range": {
      "min": 21
   },
   "picture": {
      "data": {
         "url": "https://...",
         "is_silhouette": false
      }
   }
}

但是,当我使用用户ID 时,data_range为空:

  

https://graph.facebook.com/[FacebookId]?fields=id%2Cname%2Cemail%2Cfirst_name%2Clast_name%2Cusername%2Cgender%2Cpicture%2Cage_range&format=json&access_token=[AccessToken] *

给我回复:

{
   "id": "FACEBOOKID",
   "name": "testuser",
   "email": "testuser\u0040test.net",
   "first_name": "tftestuser",
   "last_name": "tftestuser",
   "gender": "male",
   "picture": {
      "data": {
         "url": "http://....",
         "is_silhouette": true
      }
   }
}

知道为什么吗?我在这里缺少什么?

提前谢谢!

4 个答案:

答案 0 :(得分:5)

我在这里找到了一个使用API​​的答案: no age_range in facebook response (javascript sdk)

api调用“/ me”返回默认信息,该信息并不总是包含age_range。

但是你可以通过api调用请求age_range: “/我吗?字段= AGE_RANGE”

答案 1 :(得分:4)

根据Platform Updates: Operation Developer Love -

  

可供所有安装您应用的用户访问

如果用户尚未安装您的应用,则不会返回age_range。在您的情况下,该用户可能没有使用您正在获取此空白的应用程序。

age_range字段的目的还在于让您的应用确定您的应用是否可以提供一些与年龄相关的内容。因此,为用户的朋友检索age_range是不合适的,您必须获得friends_birthday权限。

修改

该链接还说 -

  

使用Facebook登录的移动应用和网站将其内容限制为18岁以上和21岁以上的人

这意味着此字段仅适用于将内容限制为 18 + 21 + 的人的应用 - 请检查!

答案 2 :(得分:1)

我也花了好几个小时试图找到解决方案。

我在下面分享我的经验:

我最初通过询问具有以下权限的用户详细信息来请求fb会话:

session.openForRead(new com.facebook.Session.OpenRequest(
                    LoginActivity2.this).setPermissions(
                    Arrays.asList("public_profile","email")).setCallback(
                    statusCallback));

使用有效会话,然后使用此代码块调用请求:

new Request(
      session,
      graphPath,
      bundle,
        HttpMethod.GET,
        new Request.Callback() {
        @Override
        public void onCompleted(Response response) {
          Log.v(TAG, "response = xx" + 
              response.toString());
          String age_min = "";
          String age_max = "";
          GraphObject graphObject = response.getGraphObject();
          Map<String, Object> stateMap = graphObject.asMap();
          try {
            JSONObject age_range = (JSONObject) stateMap.get("age_range");
            age_min = age_range.getString("min");
            age_max = age_range.getString("max");

          } catch (Exception e) {
            Log.v(TAG, "error in parsing age_range here = " + e.getMessage());
          }
          Log.v(TAG, "logging the age_range min here = " + age_min);
          Log.v(TAG, "logging the age_range max here = " + age_max);
          if (!"".equalsIgnoreCase(age_max)) {
            if ("18".equalsIgnoreCase(age_max)) {
              age_range = "0-18";
            } else if ("21".equalsIgnoreCase(age_max)) {
              age_range = "18-21";
            } 
          } else if (!"".equalsIgnoreCase(age_min)) {
            if ("18".equalsIgnoreCase(age_min)) {
              age_range = "18-21";
            } else if ("21".equalsIgnoreCase(age_min)) {
              age_range = "21-100";
            } 
          }
          Log.v(TAG, "and here in FB2 the age_range is = " + age_range);
        }
        }
    ).executeAndWait();

其中:

session(string) - &gt;有效且当前打开的会话

graphPath(string) - &gt;这是fb用户ID(可以是“我”但我没有测试过,如果“我”工作,请告诉我。

捆绑 - &gt;是您要请求的K,V参数,在age_range情况下是:

Bundle bundle = new Bundle();
bundle.putString("fields", "age_range");

请注意,请求代码块(至少在我的情况下)是在内部AsyncTask的doinBackground内完成的 - &gt;因此我使用executeAndWait()方法而不是executeAsync()。

希望这可以帮助有同样问题的人。谢谢!

答案 3 :(得分:1)

您只能检索当前登录用户的 OWN age_range,并且无法查询其他人的年龄,因此当提供的user_id与自己的ID不同时,您将得不到任何回复

请参阅https://stackoverflow.com/a/30731037/4990217

您必须明确告知API您需要age_range作为公共配置文件的一部分(无需特殊权限)。用户的年龄范围可以是13-17,18-20或21 +。

/* make the API call v.2.3 */
FB.api(
    "/me?fields=age_range",
    function (response) {
      if (response && !response.error) {
        /* handle the result */
      }
    }
);

阅读文档https://developers.facebook.com/docs/graph-api/reference/age-range/