问题
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?
回答1:
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.
回答2:
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();
}
});
}
回答3:
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.
来源:https://stackoverflow.com/questions/25098574/get-facebook-email-parse-com