Android Facebook SDK 4.X , how to get Email address and Facebook Access Token to pass it to Web Service

14,877

Solution 1

fbLoginBtn.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
        GraphRequest.newMeRequest(
            loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject me, GraphResponse response) {
                    if (response.getError() != null) {
                        // handle error
                    } else {
                        String email = me.optString("email");
                        String id = me.optString("id");
                        // send email and id to your web server
                    }
                }
            }).executeAsync();
    }

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

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

Solution 2

Easiest answer that i found after hours of searching is as follows,the highest voted answer didn't work for me and email was alway empty

LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject object,GraphResponse response) {

                            JSONObject json = response.getJSONObject();
                            try {
                                if(json != null){
                                    String text = json.getString("email");
                                    Log.d("email",text);

                                }

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,link,email,picture");
                    request.setParameters(parameters);
                    request.executeAsync();

                }

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

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

I believe setting parameters as required fields to the Graph Request is a crucial thing here. You can also use this code with LoginButton, works without issue.

****** Update******** After using this code with many accounts found that if the email isn't verified it won't be returned, in such case following code helped along with abo

facebookLoginButton.setReadPermissions("email");

Hope this helps further

Solution 3

I must add extra field for user Email.

    //register facebook login callback
    LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>()
    {
        @Override
        public void onSuccess (LoginResult loginResult)
        {
            Log.d(TAG, "FB: login success");
            showLoading(true);

            final String token = loginResult.getAccessToken().getToken();

            //prepare fields with email
            String[] requiredFields = new String[]{"email"};
            Bundle parameters = new Bundle();
            parameters.putString("fields", TextUtils.join(",", requiredFields));

            GraphRequest requestEmail = new GraphRequest(loginResult.getAccessToken(), "me", parameters, null, new GraphRequest.Callback()
            {
                @Override
                public void onCompleted (GraphResponse response)
                {
                    if (response != null)
                    {
                        GraphRequest.GraphJSONObjectCallback callbackEmail = new GraphRequest.GraphJSONObjectCallback()
                        {
                            @Override
                            public void onCompleted (JSONObject me, GraphResponse response)
                            {
                                if (response.getError() != null)
                                {
                                    Log.d(TAG, "FB: cannot parse email");
                                    showDialog(getString(R.string.dialog_message_unknown_error));
                                    showLoading(false);
                                }
                                else
                                {
                                    String email = me.optString("email");

                                    // send email and id to your web server
                                    //...
                                }
                            }
                        };

                        callbackEmail.onCompleted(response.getJSONObject(), response);
                    }
                }
            });

            requestEmail.executeAsync();
        }

        @Override
        public void onCancel ()
        {
            Log.d(TAG, "FB: login cancel");
            showDialog(getString(R.string.dialog_message_unknown_error));
        }

        @Override
        public void onError (FacebookException e)
        {
            Log.d(TAG, "FB: login error " + e.getMessage());
            showDialog(getString(R.string.dialog_message_unknown_error));
        }
    });
Share:
14,877
John
Author by

John

Updated on July 21, 2022

Comments

  • John
    John almost 2 years

    EDIT : My Question is how to get Email , UserId , Facebook Authentication with Facebook SDK 4.X , at this moment , with Ming Respond , i know how can i get Email , User Id , so my question is how to get Facebook Authentication since Session and GraphUser has just been replaced by LoginManager and AccessToken and there is no information about it?

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import com.facebook.AccessToken;
    import com.facebook.AccessTokenTracker;
    import com.facebook.CallbackManager;
    import com.facebook.FacebookCallback;
    import com.facebook.FacebookException;
    import com.facebook.Profile;
    import com.facebook.ProfileTracker;
    import com.facebook.login.LoginResult;
    import com.facebook.login.widget.LoginButton;
    import java.util.Arrays;
    
    public class RegisterActivity extends Activity {
        private String fbUserID;
        private String fbProfileName;
        private String fbAuthToken;
        private LoginButton fbLoginBtn;
        private static final String TAG = "FacebookLogin";
        CallbackManager callbackManager;
        private AccessTokenTracker accessTokenTracker;
        private ProfileTracker profileTracker;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.register_activity);
            fbLoginBtn = (LoginButton) findViewById(R.id.connect_with_facebook_button);
            fbLoginBtn.setReadPermissions(Arrays.asList("email", "user_photos", "public_profile"));
            fbLoginBtn.setBackgroundResource(R.drawable.connect_facebook_button);
    
    
            accessTokenTracker = new AccessTokenTracker() {
                @Override
                protected void onCurrentAccessTokenChanged(
                        AccessToken oldAccessToken,
                        AccessToken currentAccessToken) {
                    fbAuthToken = currentAccessToken.getToken();
                    fbUserID = currentAccessToken.getUserId();
    
    
                    Log.d(TAG, "User id: " + fbUserID);
                    Log.d(TAG, "Access token is: " + fbAuthToken);
    
    
                }
            };
    
            profileTracker = new ProfileTracker() {
                @Override
                protected void onCurrentProfileChanged(
                        Profile oldProfile,
                        Profile currentProfile) {
                    fbProfileName = currentProfile.getName();
    
                    Log.d(TAG, "User name: " + fbProfileName );
                }
            };
    
    
            fbLoginBtn.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
    
                }
    
                @Override
                public void onCancel() {
                    // App code
                }
    
                @Override
                public void onError(FacebookException exception) {
                    // App code
                }
            });
    
        }
    
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
    
    
    
        }
    
    GraphRequest request = GraphRequest.newMeRequest(
            accessToken,
            new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(
                        JSONObject user,
                        GraphResponse response) {
                    String id = user.optString("id");
                    String firstName = user.optString("first_name");
                    String lastName = user.optString("last_name");
                    String email = user.optString("email");
    
                }
    
        @Override
        public void onSaveInstanceState(Bundle savedState) {
            super.onSaveInstanceState(savedState);
        }