嗨,我正在玩新的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);
感谢任何帮助。 感谢
答案 0 :(得分:30)
执行以下操作:
设置上述权限后,通过以下方式访问电子邮件: 。user.asMap()得到( “电子邮件”));
参见下面的示例
@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);
}
}
答案 1 :(得分:24)
当您打开会话时,请尝试在权限列表中包含“email”。
如果您使用的是LoginButton,请执行以下操作:
loginButton.setReadPermissions(Arrays.asList("email"));
如果您自己打开会话,请执行以下操作:
session.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("email")));
您可以使用以下代码试验请求/权限:https://developers.facebook.com/tools/explorer/
使用这些权限成功登录后,请再次尝试请求,包括电子邮件字段。
答案 2 :(得分:15)
如果您使用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
}
});
答案 3 :(得分:1)
我找到了一个解决方案:它有效
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;
}
};