【问题标题】:Can´t get age_range from Facebook API无法从 Facebook API 获取 age_range
【发布时间】:2014-04-27 07:17:24
【问题描述】:

根据 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
      }
   }
}

但是当我使用 user 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
      }
   }
}

知道为什么吗?我在这里错过了什么?

提前谢谢你!

【问题讨论】:

    标签: json facebook facebook-graph-api


    【解决方案1】:

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

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

    但是,您可以通过 api 调用请求 age_range: "/me?fields=age_range"

    【讨论】:

      【解决方案2】:

      根据Platform Updates: Operation Developer Love-

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

      因此,如果用户尚未安装您的应用,则不会返回 age_range。与您的情况一样,该用户可能没有使用您为其空白的应用程序。

      另外age_range字段的目的是让你的应用判断你的应用是否可以提供一些年龄敏感的内容。因此,为用户的朋友检索age_range 是不合适的,您必须获得friends_birthday 的权限。

      编辑:

      链接还说-

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

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

      【讨论】:

      • 感谢您的回复。就我而言,我使用的用户是通过 Facebook 应用设置创建的测试用户,因此用户默认安装了我的应用(我选中了相应的复选框)...
      • 对不起,我按回车键快速所以我没有写完我的评论:/我的问题还没有解决...
      • 您是否在应用设置中将年龄限制设置为 18+/21+?
      • 好点。我尝试更新我的应用程序,使其适用于 18 岁以上,但这不会改变结果。我仍然没有得到年龄范围......我认为我的测试用户是 21 岁......
      • 这个答案不正确。即使用户授予应用程序权限(即安装应用程序),age_range 仍然缺失。
      【解决方案3】:

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

      我在下面分享我的经验:

      我最初通过询问具有以下权限的用户详细信息来请求 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) --> 有效且当前打开的会话

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

      bundle --> 是您将请求的 K,V 参数,在 age_range 的情况下是:

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

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

      希望这能帮助遇到同样问题的人。谢谢!

      【讨论】:

      【解决方案4】:

      您只能检索当前登录用户的OWN年龄范围,无法查询其他人的年龄,因此当提供的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/

      【讨论】:

      • hm 我使用 graph.facebook.com/… 得到 "age_range": { "min": 21 },没有最大值
      • @Toolkit 在那里你可以找到如何获得最大值,我也只是从 facebook 获得一个最小值
      • @jasan 似乎只有 21 个,也就是说,它是最大值,我在某处的官方文档中看到过
      猜你喜欢
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      相关资源
      最近更新 更多