使用新的Facebook Android SDK访问用户电子邮件

嗨,我正在玩新的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); 

任何帮助表示赞赏。 谢谢

Solutions Collecting From Web of "使用新的Facebook Android SDK访问用户电子邮件"

请执行下列操作:

如上设置权限后,通过以下方式访问电子邮件: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); } } 

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

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

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

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

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

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

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

如果你正在使用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版本(更新日志 )开始,您可以在需要的地方初始化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 } }); 

我find了一个解决scheme:它的工作原理

 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; } };