J'essaie d'obtenir l'adresse électronique de l'utilisateur une fois qu'il est connecté à mon application Android avec Facebook (sdk 4.0). J'ai lu de nombreux articles demandant la même chose mais je ne pouvais toujours pas le faire fonctionner. Je me connecte simplement à l'utilisateur avec le code
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends", "email"));
Puis je fais la requête Graph API avec
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
}
});
La sortie est juste
{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[public_profile, contact_email, user_friends, email, basic_info]}
{"id":"xxxxxxxxxxxxxxx"}
Même si je supprime la partie "champs", j'obtiens un JSON contenant de nombreuses informations publiques, mais jamais le champ email. Je teste cela sur mon propre compte Facebook et une adresse électronique y est associée.
Vous pouvez obtenir le courrier électronique de l'utilisateur connecté comme suit, mais notez que,
Ils ne garantissent pas que vous obtiendrez une adresse e-mail lisez ici .
Dans certains cas, bien que l'utilisateur ait fourni un email, celui-ci ne sera pas envoyé par requête, si l'email n'est pas valide.
@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();
}
Voici le code complet à travers lequel je reçois toutes les données dont nous avons besoin de 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
}
});
Et la réponse de l'appel dans le journal est la suivante:
{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}
J'espère que ceci vous aidera.
fbLoginButton.setReadPermissions("public_profile", "user_friends", "user_photos", "email", "user_birthday", "public_profile", "contact_email");
"contact_email" est l'autorisation de messagerie, il me manquait que lorsque je l'ai ajouté, les choses se sont bien passées.