Я столкнулся со следующей проблемой: мне нужно получить идентификатор FB и адрес электронной почты после авторизации.Вот мой код:
@Override
public void onSuccess(LoginResult loginResult) {
final String[] email = new String[1];
final String[] id = new String[1];
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
(object, response) -> {
try {
email[0] = object.getString(FB_EMAIL_PERMISSION);
id[0] = object.getString(FB_ID_PERMISSION);
} catch (JSONException e) {
e.printStackTrace();
}
response.getRawResponse();
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,email");
request.setParameters(parameters);
request.executeAsync();
Bundle bundle = new Bundle();
bundle.putString(EXTRA_TOKEN, loginResult.getAccessToken().getToken());
bundle.putString(EXTRA_EMAIL, email[0]);
bundle.putString(EXTRA_ID, id[0]);
mPresenter.saveUserData(bundle);
}
Но когда я запускаю свое приложение, я не получаю эти поля.Я проверил в отладчике, и часть
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
(object, response) -> {
try {
email[0] = object.getString(FB_EMAIL_PERMISSION);
id[0] = object.getString(FB_ID_PERMISSION);
} catch (JSONException e) {
e.printStackTrace();
}
response.getRawResponse();
});
вообще не вызывается.Я не понимаю, почему это происходит.Итак, в чем дело и как я могу это решить?
UPD
Возможно, возможно, это поможет, вот вся логика fb:
mCallbackManager = CallbackManager.Factory.create();
mFacebookButton.setReadPermissions(Collections.singletonList(FB_EMAIL_PERMISSION));
mFacebookButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
final String[] email = new String[1];
final String[] id = new String[1];
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
(object, response) -> {
try {
email[0] = object.getString(FB_EMAIL_PERMISSION);
id[0] = object.getString(FB_ID_PERMISSION);
} catch (JSONException e) {
e.printStackTrace();
}
response.getRawResponse();
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,email");
request.setParameters(parameters);
request.executeAsync();
Bundle bundle = new Bundle();
bundle.putString(EXTRA_TOKEN, loginResult.getAccessToken().getToken());
bundle.putString(EXTRA_EMAIL, email[0]);
bundle.putString(EXTRA_ID, id[0]);
mPresenter.saveUserData(bundle);
}
UPD 2
У меня одна мысль об этой проблеме: этот запрос асинхронный, и когда я ставлю точку останова на строку mPresenter.saveUserData(bundle);
информация еще не загружена, но как я могу это сделать?сделать это синхронно?Или, может быть, я ошибаюсь?
UPD 3
Я изменил свой запрос следующим образом, но он все равно не работает, и точки прерывания в этой части пропускаются.
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
(object, response) -> {
try {
if (response.getJSONObject() != null) {
JSONObject data = response.getJSONObject();
if (data.has(FB_EMAIL_PERMISSION)) {
email[0] = response.getJSONObject().getString(FB_EMAIL_PERMISSION);
}
if (data.has(FB_ID_PERMISSION)) {
id[0] = response.getJSONObject().getString(FB_ID_PERMISSION);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
response.getRawResponse();
});
А вот значения разрешений:
private static final String FB_EMAIL_PERMISSION = "email";
private static final String FB_ID_PERMISSION = "id";