无法获取Facebook ID和电子邮件

时间:2019-05-26 13:27:41

标签: java android facebook facebook-authentication

我面临以下问题:授权后,我需要获取FB ID和电子邮件。这是我的代码:

@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 个答案:

答案 0 :(得分:1)

您是否向Facebook登录按钮添加了权限

function startGame() {
    myGamePiece = new component(50, 10, "grey", 240, 20);
    myAponent = new component(50, 10, "grey", 240, 460);
    myScore = new component("30px", "Consolas", "black", 280, 40, "text");
    myGameArea.start();
}

答案 1 :(得分:0)

这就是我的使用方式 我不确定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();
                        }
                    }
                });