Не могу получить идентификатор Facebook и адрес электронной почты - PullRequest
0 голосов
/ 26 мая 2019

Я столкнулся со следующей проблемой: мне нужно получить идентификатор 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";

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Вы добавили разрешение на кнопку входа в Facebook

fbLoginButton.setPermissions(Arrays.asList("public_profile,email,user_birthday"));
0 голосов
/ 27 мая 2019

это то, как я использую его, я не уверен в значении FB_EMAIL_PERMISSION FB_ID_PERMISSION

 final GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject object,
                            GraphResponse response) {
                        try {
                            String id = "", user_email = "", name = "";
                            Log.d("EHREIUIU", String.valueOf(object));
                            if (response.getJSONObject() != null) {
                                JSONObject data = response.getJSONObject();
                                if (data.has("id"))
                                    id = data.getString("id");
                                if (data.has("email"))
                                    user_email = data.getString("email");
                            }
                            getOneSignalToken();
                            socialLogin(user_email, name, null, id, "facebook");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
...