2

I am trying to save a facebook user's email when they log in to my app. The only example parse provides is this, but It does not save emails even when I ask for the correct facebook permission.

private void onLoginButtonClicked() {
    if (loginProgressDialog != null) {
        loginProgressDialog.dismiss();
        loginProgressDialog = null;
    }

    loginProgressDialog = ProgressDialog.show(LoginActivity.this, "", "Logging in...", true);
    List<String> permissions = Arrays.asList("public_profile", "user_about_me", "user_relationships", "user_birthday", "user_location", "email");
    ParseFacebookUtils.logIn(permissions, this, new LogInCallback() {
        @Override
        public void done(ParseUser user, ParseException err) {
            if (loginProgressDialog != null) {
                loginProgressDialog.dismiss();
                loginProgressDialog = null;
            }

            if (user == null) {
                Log.d("The Bar App", "Uh oh. The user cancelled the Facebook login.");
            } else if (user.isNew()) {
                Log.d("The Bar App", "User signed up and logged in through Facebook!");
                showNextActivity();
            } else {
                Log.d("The Bar App", "User logged in through Facebook!");
                showNextActivity();
            }
        }
    });
}

Is there a facebook object or some JSON that gets returned that I could grab emails from?

mziemer
  • 338
  • 3
  • 13

3 Answers3

4

You've asked for the permissions, now you have to actually ask for the data.

You need to do a graph query for /me.

https://developers.facebook.com/docs/android/graph

There's a method called executeMeRequestAsync(), you'll need to try looking at getProperty("email") for the email to see if they've shared that information, make sure you handle when this is empty.

Timothy Walters
  • 16,866
  • 2
  • 41
  • 49
3

Final code for future reference.

private void onLoginButtonClicked() {
    if (loginProgressDialog != null) {
        loginProgressDialog.dismiss();
        loginProgressDialog = null;
    }

    loginProgressDialog = ProgressDialog.show(LoginActivity.this, "", "Logging in...", true);
    List<String> permissions = Arrays.asList("public_profile", "user_about_me", "user_relationships", "user_birthday", "user_location", "email");
    ParseFacebookUtils.logIn(permissions, this, new LogInCallback() {
        @Override
        public void done(ParseUser pUser, ParseException err) {

            if (email != null) {
                pUser.put("email", email);
            }
            if (fName != null) {
                pUser.put("firstName", fName);
            }
            if (lName != null) {
                pUser.put("lastName", lName);
            }
            if (birthday != null) {
                pUser.put("birthday", birthday);
            }
            if (relationship != null) {
                pUser.put("relationship", relationship);
            }

            pUser.saveInBackground();

            if (loginProgressDialog != null) {
                loginProgressDialog.dismiss();
                loginProgressDialog = null;
            }

            if (pUser == null) {
                Log.d("The Bar App", "Uh oh. The user cancelled the Facebook login.");
            } else if (pUser.isNew()) {
                Log.d("The Bar App", "User signed up and logged in through Facebook!");
                showNextActivity();
            } else {
                Log.d("The Bar App", "User logged in through Facebook!");
                showNextActivity();
            }
        }
    });

    com.facebook.Request.executeMeRequestAsync(ParseFacebookUtils.getSession(), new com.facebook.Request.GraphUserCallback() {

        @Override
        public void onCompleted(GraphUser user, Response response) {
            email = user.getProperty("email").toString();
            fName = user.getFirstName();
            lName = user.getLastName();
            birthday = user.getBirthday();
            relationship = user.getProperty("relationship_status").toString();


        }
    });
}
mziemer
  • 338
  • 3
  • 13
1

The following code is what I ended up with after going through some solutions. I would like to thank @marialena and @mziemer for their detailed solutions.

//facebook button click
                pbLogin.setVisibility(View.VISIBLE);

                ParseFacebookUtils.logInWithReadPermissionsInBackground(this, permissions, new LogInCallback() {
                    @Override
                    public void done(final ParseUser user, ParseException err) {
                        if (user == null) {
                            Log.d(TAG, "The user cancelled the Facebook login.");
                            Toast.makeText(getApplicationContext(), "Logout from Facebook and try again.", Toast.LENGTH_SHORT).show();
                            ParseUser.logOut();
                            pbLogin.setVisibility(View.GONE);
                        } else if (user.isNew()) {
                            Log.d(TAG, "User signed up and logged in through Facebook!");
                            getFacebookUserDetails(true, user, err);
                        } else {
                            getFacebookUserDetails(false, user, err);
                        }
                    }
                });

 public void getFacebookUserDetails(final boolean firstTime, final ParseUser user, final ParseException error) {

        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject object,
                            GraphResponse response) {
                        // Application code
                        try {
                            userName = object.getString("name");
                            userId = object.getString("id");
                            userGender = object.getString("gender");
                            userProfileURL = object.getString("link");
                            userEmail = object.getString("email");
                            firstName = object.getString("first_name");
                            lastName = object.getString("last_name");

                            JSONObject ageJsonObject = object.getJSONObject("age_range");
                            userAgeRangeMin = ageJsonObject.getString("min");

                            JSONObject picObject = object.getJSONObject("picture");
                            JSONObject dataObject = picObject.getJSONObject("data");
                            userPhoto = dataObject.getString("url");

                            Log.d(TAG, userName);
                            Log.d(TAG, userEmail);
                            Log.d(TAG, firstName);

                            //Storing userInfo in SharedPreferences

                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "firstName", firstName);
                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "lastName", lastName);
                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "userName", userName);
                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "userPhoto", userPhoto);
                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "userId", userId);
                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "userGender", userGender);
                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "userProfileURL", userProfileURL);
                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "userEmail", userEmail);
                            SharedPreferenceHelper.setSharedPreferenceString(getApplicationContext(), "userAgeRangeMin", userAgeRangeMin);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        //User logged in with facebook for the first time
                        if (firstTime) {

                            if (!ParseFacebookUtils.isLinked(user)) {
                                ParseFacebookUtils.linkWithReadPermissionsInBackground(user, BlurredLoginActivity.this, permissions, new SaveCallback() {
                                    @Override
                                    public void done(ParseException ex) {
                                        if (ParseFacebookUtils.isLinked(user)) {
                                            Log.d(TAG, "Woohoo, user logged in with Facebook!");

                                            user.setUsername(userEmail);
                                            user.setEmail(userEmail);
                                            user.put("FirstName", firstName);
                                            user.put("LastName", lastName);
                                            user.put("FullName", firstName + " " + lastName);

                                            user.signUpInBackground(new SignUpCallback() {
                                                @Override
                                                public void done(ParseException e) {
                                                    if (e == null) {
                                                        // Verifying parse configuration. This is method is for developers only.
                                                        ParseUtils.verifyParseConfiguration(BlurredLoginActivity.this);
                                                        ParseUtils.subscribeWithUsername(userEmail);
                                                        Intent successIntent = new Intent(BlurredLoginActivity.this, OurServicesActivity.class);
                                                        startActivity(successIntent);
                                                        overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
                                                        finish();
                                                    } else
                                                        Log.e(TAG, e.getMessage());
                                                }
                                            });


                                        }
                                    }
                                });
                            } else {
                                user.setUsername(userEmail);
                                user.put("FirstName", firstName);
                                user.put("LastName", lastName);
                                user.put("FullName", firstName + " " + lastName);
                                user.setEmail(userEmail);
                                user.saveInBackground();

                                ParseUtils.verifyParseConfiguration(BlurredLoginActivity.this);
                                ParseUtils.subscribeWithUsername(userEmail);

                                Toast.makeText(getApplicationContext(), "You can change your personal data in Settings tab!", Toast.LENGTH_SHORT).show();
                                Intent facebookIntent = new Intent(BlurredLoginActivity.this, OurServicesActivity.class);
                                startActivity(facebookIntent);
                                overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
                            }
                            pbLogin.setVisibility(View.GONE);


                        } else {

                            Log.d(TAG, "User logged in through Facebook!");

                            if (!ParseFacebookUtils.isLinked(user)) {
                                ParseFacebookUtils.linkWithReadPermissionsInBackground(user, BlurredLoginActivity.this, permissions, new SaveCallback() {
                                    @Override
                                    public void done(ParseException ex) {
                                        if (ParseFacebookUtils.isLinked(user)) {
                                            Log.d(TAG, "Woohoo, user logged in with Facebook!");

                                            user.setUsername(userEmail);
                                            user.setEmail(userEmail);
                                            user.put("FirstName", firstName);
                                            user.put("LastName", lastName);
                                            user.put("FullName", firstName + " " + lastName);
                                            user.saveInBackground();

                                            ParseUtils.verifyParseConfiguration(BlurredLoginActivity.this);
                                            ParseUtils.subscribeWithUsername(userEmail);

                                            Intent facebookIntent = new Intent(BlurredLoginActivity.this, OurServicesActivity.class);
                                            startActivity(facebookIntent);
                                            overridePendingTransition(R.animator.fade_in, R.animator.fade_out);

                                            pbLogin.setVisibility(View.GONE);
                                        }
                                    }
                                });
                            } else {

                                user.setUsername(userEmail);
                                user.setEmail(userEmail);
                                user.put("FirstName", firstName);
                                user.put("LastName", lastName);
                                user.put("FullName", firstName + " " + lastName);
                                user.saveInBackground();

                                ParseUtils.verifyParseConfiguration(BlurredLoginActivity.this);
                                ParseUtils.subscribeWithUsername(userEmail);

                                Intent facebookIntent = new Intent(BlurredLoginActivity.this, OurServicesActivity.class);
                                startActivity(facebookIntent);
                                overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
                                pbLogin.setVisibility(View.GONE);
                            }
                        }

                    }
                });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "age_range,gender,name,id,link,email,picture.type(large),first_name,last_name");
        request.setParameters(parameters);
        request.executeAsync();

    }

There are few scenarios I still haven't come across from this code. Will update as and when I come across them.

Community
  • 1
  • 1
Akshay
  • 1,020
  • 6
  • 10