it-swarm.dev

Как получить адрес электронной почты зарегистрированного пользователя с помощью Graph Request в Facebook Android SDK 4.0

Я пытаюсь получить адрес электронной почты пользователя, как только он вошел в мое приложение для Android через Facebook (SDK 4.0). Я прочитал много постов, спрашивающих об одном и том же, но я все еще не мог заставить его работать. Я просто авторизирую пользователя с помощью кода

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends", "email"));

Затем я делаю запрос API Graph с

LoginManager.getInstance().registerCallback(fbCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    System.out.println(loginResult.getAccessToken().toString());

                    GraphRequest request = GraphRequest.newMeRequest(
                            loginResult.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(
                                        JSONObject object,
                                        GraphResponse response) {
                                    System.out.println(object.toString());

                                }
                            });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "email");
                    request.setParameters(parameters);
                    request.executeAsync();
                }

                @Override
                public void onCancel() {
                    // App code
                }

                @Override
                public void onError(FacebookException exception) {
                    // App code
                }
            });

Результат просто 

{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[public_profile, contact_email, user_friends, email, basic_info]}
{"id":"xxxxxxxxxxxxxxx"}

Даже если я удаляю часть «поля», я получаю JSON с кучей общедоступной информации пользователя, но не поле электронной почты. Я тестирую это на своей собственной учетной записи в Facebook, и у меня есть адрес электронной почты, связанный с ним.

14
splinter123

Вы можете получить зарегистрированную электронную почту пользователя следующим образом, но учтите, что 

  1. Они не гарантируют, что вы получите адрес электронной почты читайте здесь .

  2. В некоторых случаях, несмотря на то, что пользователь предоставил электронное письмо, оно не будет отправлено через запрос, если оно недействительно.

    @Override
    public void onSuccess(LoginResult loginResult) {
    
    
    GraphRequest request = GraphRequest.newMeRequest( AccessToken.getCurrentAccessToken(),
            new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject object,GraphResponse response) {
                try {
                    String  email=object.getString("email");
                    Log.d(TAG + "user email ", email);
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
                }
    
                });
    
                request.executeAsync();                        
     }
    
13
Heshan Sandeepa

Вот полный код, с помощью которого я получаю все необходимые данные с Facebook

 login_facebook_button = (LoginButton) findViewById(R.id.login_facebook_button);
    login_facebook_button.setReadPermissions(Arrays.asList("public_profile", "user_friends", "email", "user_birthday"));
    //LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
    // Callback registration
    login_facebook_button.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            // App code
            Log.e("onSuccess", "--------" + loginResult.getAccessToken());
            Log.e("Token", "--------" + loginResult.getAccessToken().getToken());
            Log.e("Permision", "--------" + loginResult.getRecentlyGrantedPermissions());
            Profile profile = Profile.getCurrentProfile();
            Log.e("ProfileDataNameF", "--" + profile.getFirstName());
            Log.e("ProfileDataNameL", "--" + profile.getLastName());

            Log.e("Image URI", "--" + profile.getLinkUri());

            Log.e("OnGraph", "------------------------");
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(
                                JSONObject object,
                                GraphResponse response) {
                            // Application code
                            Log.e("GraphResponse", "-------------" + response.toString());
                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,link,gender,birthday,email");
            request.setParameters(parameters);
            request.executeAsync();

        }

        @Override
        public void onCancel() {
            // App code
        }

        @Override
        public void onError(FacebookException exception) {
            // App code
        }
    });

И ответ на звонок в журнале:

{Response:  responseCode: 200, graphObject: {"id":"896337040431723","name":"Aneh Thakur","link":"https:\/\/www.facebook.com\/app_scoped_user_id\/896337040431723\/","gender":"male","birthday":"08\/05\/1992","email":"[email protected]"}, error: null}

Надеюсь, что это поможет вам.

12
Aneh Thakur
fbLoginButton.setReadPermissions("public_profile", "user_friends", "user_photos", "email", "user_birthday", "public_profile", "contact_email");

«contact_email» - это разрешение электронной почты, мне не хватало того, что когда я его добавил, у меня все заработало. 

1
Dhiraj Singh