【问题标题】:Access user email using new Facebook Android SDK使用新的 Facebook Android SDK 访问用户电子邮件
【发布时间】:2015-08-26 22:16:59
【问题描述】:

您好,我正在使用新的 Facebook Android SDK。我想不通的一件事是我如何询问电子邮件地址。我尝试了以下操作,但它返回了除电子邮件地址之外的所有字段的值。我想我可能需要单独请求电子邮件地址的许可,但不确定如果我使用 LoginFragment 该怎么做。

Request request = Request.newMeRequest(session, new GraphUserCallback() {

    @Override
    public void onCompleted(GraphUser user, Response response) {
        profilePictureView.setUserId(user.getId());
        userNameView.setText(user.getName());
    }
});

String NAME = "name";
String ID = "id";
String PICTURE = "picture";
String EMAIL = "email";
String FIELDS = "fields";
String REQUEST_FIELDS = TextUtils.join(",", new String[] {
    ID, NAME, PICTURE, EMAIL
});

Bundle parameters = new Bundle();
parameters.putString(FIELDS, REQUEST_FIELDS);
request.setParameters(parameters);
Request.executeBatchAsync(request);

感谢任何帮助。 谢谢

【问题讨论】:

  • 我猜你必须指定 sdk 版本而不是提及“新 Facebook android sdk”

标签: android facebook-android-sdk


【解决方案1】:

执行以下操作:

如上设置权限后,通过以下方式访问电子邮件: user.asMap().get("email"));

请看下面的例子

@Override
protected void onSessionStateChange(SessionState state, Exception exception) {

    // user has either logged in or not ...
    if (state.isOpened()) {
        // make request to the /me API
        Request request = Request.newMeRequest(this.getSession(),
                new Request.GraphUserCallback() {
                    // callback after Graph API response with user object

                    @Override
                    public void onCompleted(GraphUser user,
                            Response response) {
                        // TODO Auto-generated method stub
                        if (user != null) {
                            TextView etName = (TextView) findViewById(R.id.etName);

                            etName.setText(user.getName() + ","
                                    + user.getUsername() + ","
                                    + user.getId() + "," + user.getLink()
                                    + "," + user.getFirstName()+ user.asMap().get("email"));

                        }
                    }
                });
        Request.executeBatchAsync(request);
    }
}

【讨论】:

  • 用这个方法也能得到头像吗? (我的意思是使用 Request 类)
  • 我尝试像这样设置读取权限:authButton.setReadPermissions(Arrays.asList("email"));,然后尝试像 user.asMap().get("email") 这样访问电子邮件,但它总是返回 null
  • 查看来自 Facebook here 的报告。
  • @toobsco42 因为它返回 null 的原因是,您给定的帐户没有授予提供电子邮件的权限,请尝试使用另一个帐户。
  • 如果我们不提供访问电子邮件地址的权限会发生什么,我们可以要求应用程序本身提供用户的电子邮件地址
【解决方案2】:

当您打开会话时,请尝试在权限列表中包含“电子邮件”。

如果您使用的是 LoginButton,请执行以下操作:

loginButton.setReadPermissions(Arrays.asList("email"));

如果您自己打开会话,请执行以下操作:

session.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("email")));

您可以使用以下方式试验请求/权限:https://developers.facebook.com/tools/explorer/

使用这些权限成功登录后,请再次尝试请求,包括电子邮件字段。

【讨论】:

  • 如果您使用 SDK 中的内置 LoginFragment,您如何传递额外的字段?
  • LoginFragment 还有一个 setReadPermissions 方法。
  • Iam 请求 emial 作为 Session.OpenRequest openRequest = null; openRequest = new Session.OpenRequest(LoginActivity.this); if (openRequest != null) { openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS); openRequest.setPermissions(Arrays.asList("email")); mCurrentSession.openForRead(openRequest); } 但我的 Log.d("user email", (String) user.getProperty("email") );
  • 您正在获取 null,因为您需要确保在实际 Facebook 应用程序网页的权限中设置 Facebook 应用程序中的权限。
  • loginButton.setReadPermissions(Arrays.asList("email")) 对我不起作用。不知道我做的其他事情是否是问题,或者这不再有效。我成功使用了 Golan Shay 的答案。
【解决方案3】:

如果您使用com.facebook.widget.LoginButton,您应该设置此片段的权限,之后facebook 会返回电子邮件。这是工作代码:

LoginButton authButton = findViewById(R.id.sign_in_facebook);
    List<String> permissions = new ArrayList<>();
    permissions.add("public_profile");
    permissions.add("email");
    permissions.add("user_birthday");
    authButton.setReadPermissions(permissions);`

编辑 Facebook 更新了它的 sdk,这促进了它的工作。从 4.x 版本(changelog) 开始,您可以在需要它的不同地方初始化 sdk,而不是以非常简单的方式使用它。这是示例:

FacebookSdk.sdkInitialize(getActivity().getApplicationContext());
CallbackManager callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    GraphRequest request = GraphRequest.newMeRequest(
                            loginResult.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject object, GraphResponse response) {
                                    String email = object.optString("email");
                                    String uid = object.optString("id");
                                    loginPresenter.loginBySocial(email, uid);
                                }
                            });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "email");
                    request.setParameters(parameters);
                    request.executeAsync();
                }

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

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

【讨论】:

  • 我正在搜索过去几天...您的回答对我有帮助
  • @vovaxo 我是 Android FB 集成的新手。完成后,我从哪里获得用户的电子邮件?
  • @Teju 有你应该实现Session.StatusCallback 的接口。内部回调方法:`@Override public void call(Session session, SessionState sessionState, Exception e) { if (sessionState.isOpened() && session.isOpened()) { Request me = Request.newMeRequest(session, new Request.GraphUserCallback( ) { @Override public void onCompleted(GraphUser graphUser, Response response) { String email = graphUser.asMap().get("email").toString(); } });我.executeAsync(); } }`
  • 这不会返回某些帐户的电子邮件,而其他类似的应用程序正在使用 Facebook 登录的同一帐户,奇怪,有什么线索吗?
【解决方案4】:

我找到了一个解决方案:它有效

LoginFragment loginFragment = new LoginFragment() {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View v = super.onCreateView(inflater, container, savedInstanceState);
                setReadPermissions(Arrays.asList("email"));
                return v;
            }
        };

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多