Android Facebook 4.0 SDK Comment obtenir l'e-mail, la date de naissance et le sexe de l'utilisateur

144

J'utilise le code suivant. Je veux la date de naissance, l'adresse e-mail et le sexe de l'utilisateur. Veuillez aider. Comment récupérer ces données?

C'est mon onViewCreated()intérieur du Fragment.

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    // Setup TextView.
    mTextDetails = (TextView) view.findViewById(R.id.text_details);

    // Set up Login Button.
    LoginButton mButtonLogin = (LoginButton) view.findViewById(R.id.login_button);
    // setFragment only if you are using it inside a Fragment.
    mButtonLogin.setFragment(this);
    mButtonLogin.setReadPermissions("user_friends");
    mButtonLogin.setReadPermissions("public_profile");
    mButtonLogin.setReadPermissions("email");
    mButtonLogin.setReadPermissions("user_birthday");

    // Register a callback method when Login Button is Clicked.
    mButtonLogin.registerCallback(mCallbackManager, mFacebookCallback);

}

Ceci est ma méthode de rappel.

private FacebookCallback<LoginResult> mFacebookCallback = new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
        Log.d("Shreks Fragment", "onSuccess");


        Profile profile = Profile.getCurrentProfile();
        Log.d("Shreks Fragment onSuccess", "" +profile);

        // Get User Name
        mTextDetails.setText(profile.getName() + "");

    }


    @Override
    public void onCancel() {
        Log.d("Shreks Fragmnt", "onCancel");
    }

    @Override
    public void onError(FacebookException e) {
        Log.d("Shreks Fragment", "onError " + e);
    }
};
Sriyank Siddhartha
la source
Salut, @Sriyank, aidez-moi si vous avez résolu votre problème. Je veux obtenir les informations de l'utilisateur à partir du fragment de connexion Facebook après la connexion. Je veux passer à l'activité suivante, veuillez me dire comment puis-je faire cela?
Devendra Singh
la solution ci-dessous mais attention car l'e-mail peut être vide si l'utilisateur est connecté via son numéro de téléphone Visitez stackoverflow.com/questions/29517667/... et stackoverflow.com/questions/29493486/…
pegaltier

Réponses:

335

Ce n'est pas la bonne façon de définir les autorisations car vous les écrasez à chaque appel de méthode.

Remplacez ceci:

mButtonLogin.setReadPermissions("user_friends");
mButtonLogin.setReadPermissions("public_profile");
mButtonLogin.setReadPermissions("email");
mButtonLogin.setReadPermissions("user_birthday");

Avec ce qui suit, car la méthode setReadPermissions()accepte un ArrayList:

loginButton.setReadPermissions(Arrays.asList(
        "public_profile", "email", "user_birthday", "user_friends"));

Voici également comment interroger des données supplémentaires GraphRequest:

private LoginButton loginButton;
private CallbackManager callbackManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    loginButton = (LoginButton) findViewById(R.id.login_button);

    loginButton.setReadPermissions(Arrays.asList(
            "public_profile", "email", "user_birthday", "user_friends"));

    callbackManager = CallbackManager.Factory.create();

    // Callback registration
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            // App code
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject object, GraphResponse response) {
                            Log.v("LoginActivity", response.toString());

                            // Application code
                            String email = object.getString("email");
                            String birthday = object.getString("birthday"); // 01/31/1980 format
                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,email,gender,birthday");
            request.setParameters(parameters);
            request.executeAsync();


        }

        @Override
        public void onCancel() {
            // App code
            Log.v("LoginActivity", "cancel");
        }

        @Override
        public void onError(FacebookException exception) {
            // App code
            Log.v("LoginActivity", exception.getCause().toString());
        }
    });
}

ÉDITER:

Un problème possible est que Facebook suppose que votre e-mail n'est pas valide. Pour le tester, utilisez l' Explorateur d'API Graph et essayez de l'obtenir. Si même là, vous ne pouvez pas recevoir votre e-mail, modifiez-le dans les paramètres de votre profil et réessayez. Cette approche a résolu ce problème pour certains développeurs commentant ma réponse.

schwertfisch
la source
2
Hey @Schwertfisch pouvez-vous montrer comment utiliser object.getString ("email"); , ce serait très utile pour moi :)
Ajeet
3
pourquoi est-ce que j'obtiens l'erreur "Aucune valeur pour l'e-mail" alors que j'ai déjà défini loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));?
stackex
1
@Schwertfisch dans mon cas, je n'ai pas pu recevoir mon e-mail même en utilisant Graph API Explorer, j'ai donc ajouté un e-mail alternatif à mon compte et cela a fonctionné, peut-être que votre e-mail n'est pas valide.
Kayan Almeida
1
@DevendraSingh vous devez obtenir les valeurs et les mettre dans un extra, Intent myIntent = new Intent (this, SecondActivity.class); myIntent.putExtra ("email", object.getString ("email")); .... Dans la deuxième activité Bundle extras = getIntent (). GetExtras (); if (extras! = null) {email = extras.getString ("email"); } Vous pouvez également avoir une variable statique et attribuer la valeur. Désolé pour mon anglais. Je ne sais pas si c'est la réponse que vous voulez
schwertfisch
85
Je dois juste dire que les documents Facebook sont si pauvres! c'est dommage que nous ayons besoin de savoir comment le faire ici.
Gal Rom
13

Utilisez cet extrait pour obtenir toutes les informations de profil

private FacebookCallback<LoginResult> callback = new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            AccessToken accessToken = loginResult.getAccessToken();
            Profile profile = Profile.getCurrentProfile();

            // Facebook Email address
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(
                                JSONObject object,
                                GraphResponse response) {
                            Log.v("LoginActivity Response ", response.toString());

                            try {
                                Name = object.getString("name");

                                FEmail = object.getString("email");
                                Log.v("Email = ", " " + FEmail);
                                Toast.makeText(getApplicationContext(), "Name " + Name, Toast.LENGTH_LONG).show();


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


        }

        @Override
        public void onCancel() {
            LoginManager.getInstance().logOut();

        }

        @Override
        public void onError(FacebookException e) {

        }
    };
Arpit Patel
la source
12

Vous n'obtiendrez pas le profil que onSuccess()vous devez implémenter ProfileTrackeravec l'enregistrement du rappel

mProfileTracker = new ProfileTracker() {
    @Override
    protected void onCurrentProfileChanged(Profile oldProfile, Profile newProfile) {
        // Fetch user details from New Profile
    }
};

N'oubliez pas non plus de gérer le démarrage et l'arrêt du suivi de profil

Vous aurez maintenant un profil pour obtenir AccessToken (résolu le problème du profil nul). Il vous suffit d'utiliser " https://developers.facebook.com/docs/android/graph#userdata " pour obtenir des données.

Ankit Bansal
la source
1
Mais quelle est la syntaxe pour obtenir le dob et le sexe de l'e-mail? pouvez-vous s'il vous plaît me dire
Sriyank Siddhartha
2
J'obtiens ceci comme jeton d'accès: {jeton AccessToken: permissions ACCESS_TOKEN_REMOVED: [user_friends, email, user_birthday, basic_info]} J'utilise ce code sous FacebookCallBack ---- AccessToken mAccessToken = loginResult.getAccessToken (); Pouvez-vous me dire ce que cela signifie? et comment résoudre cette erreur et obtenir un jeton d'accès?
Sriyank Siddhartha
@SriyankSiddhartha Avez-vous une solution pour cela? Pourriez-vous mettre à jour ici, Face au même problème
Prabha1
@Sriyank, je suis également confronté au même problème, je ne parviens pas à obtenir mon identifiant de messagerie. s'il vous plaît aidez-moi si vous trouvez des solutions. Merci d'avance.
Ramesh
Je ne suis toujours pas en mesure de trouver une solution ... J'utilise toujours l'ancien sdk .. s'il vous plaît laissez-moi savoir si vous obtenez la solution .. merci
Sriyank Siddhartha
8

Après connexion

private void getFbInfo() {
    GraphRequest request = GraphRequest.newMeRequest(
            AccessToken.getCurrentAccessToken(),
            new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(
                        JSONObject object,
                        GraphResponse response) {
                    try {
                        Log.d(LOG_TAG, "fb json object: " + object);
                        Log.d(LOG_TAG, "fb graph response: " + response);

                        String id = object.getString("id");
                        String first_name = object.getString("first_name");
                        String last_name = object.getString("last_name");
                        String gender = object.getString("gender");
                        String birthday = object.getString("birthday");
                        String image_url = "http://graph.facebook.com/" + id + "/picture?type=large";

                        String email;
                        if (object.has("email")) {
                            email = object.getString("email");
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
    Bundle parameters = new Bundle();
    parameters.putString("fields", "id,first_name,last_name,email,gender,birthday"); // id,first_name,last_name,email,gender,birthday,cover,picture.type(large)
    request.setParameters(parameters);
    request.executeAsync();
}
Ahamadullah Saikat
la source
2

Cela fonctionne pour moi, j'espère aider quelqu'un (en utilisant mon propre bouton et non le bouton de connexion FB)

CallbackManager callbackManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    setContentView(R.layout.activity_sign_in_user);



     LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {


            GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject object, GraphResponse response) {
                    try {
                        Log.i("RESAULTS : ", object.getString("email"));
                    }catch (Exception e){

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

        }

        @Override
        public void onCancel() {

        }

        @Override
        public void onError(FacebookException error) {
            Log.i("RESAULTS : ", error.getMessage());
        }
    });


}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    callbackManager.onActivityResult(requestCode, resultCode, data);
    super.onActivityResult(requestCode, resultCode, data);
}


boolean isEmailValid(CharSequence email) {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

public void signupwith_facebook(View view) {

    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile","email"));
}
}
Ali Adil
la source
2

Voici le code pour trouver l'ID de messagerie, le nom et l'URL du profil, etc.

    private CallbackManager callbackManager;

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_sign_in);
//TODO on click of fb custom button call handleFBLogin()
     callbackManager = CallbackManager.Factory.create();
    }

    private void handleFBLogin() {
            AccessToken accessToken = AccessToken.getCurrentAccessToken();
            boolean isLoggedIn = accessToken != null && !accessToken.isExpired();

            if (isLoggedIn && Store.isUserExists(ActivitySignIn.this)) {
                goToHome();
                return;
            }

            LoginManager.getInstance().logInWithReadPermissions(ActivitySignIn.this, Arrays.asList("public_profile", "email"));
            LoginManager.getInstance().registerCallback(callbackManager,
                    new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(final LoginResult loginResult) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    setFacebookData(loginResult);
                                }
                            });
                        }

                        @Override
                        public void onCancel() {
                            Toast.makeText(ActivitySignIn.this, "CANCELED", Toast.LENGTH_SHORT).show();
                        }

                        @Override
                        public void onError(FacebookException exception) {
                            Toast.makeText(ActivitySignIn.this, "ERROR" + exception.toString(), Toast.LENGTH_SHORT).show();
                        }
                    });
        }

private void setFacebookData(final LoginResult loginResult) {
        GraphRequest request = GraphRequest.newMeRequest(
                loginResult.getAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        // Application code
                        try {
                            Log.i("Response", response.toString());

                            String email = response.getJSONObject().getString("email");
                            String firstName = response.getJSONObject().getString("first_name");
                            String lastName = response.getJSONObject().getString("last_name");
                            String profileURL = "";
                            if (Profile.getCurrentProfile() != null) {
                                profileURL = ImageRequest.getProfilePictureUri(Profile.getCurrentProfile().getId(), 400, 400).toString();
                            }

                           //TODO put your code here
                        } catch (JSONException e) {
                            Toast.makeText(ActivitySignIn.this, R.string.error_occurred_try_again, Toast.LENGTH_SHORT).show();
                        }
                    }
                });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,email,first_name,last_name");
        request.setParameters(parameters);
        request.executeAsync();
    }
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            callbackManager.onActivityResult(requestCode, resultCode, data);
    }
aanshu
la source
2

Voici une solution de travail (2019): mettez ce code dans votre logique de connexion;

 GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject json, GraphResponse response) {
                    // Application code
                    if (response.getError() != null) {
                        System.out.println("ERROR");
                    } else {
                        System.out.println("Success");
                        String jsonresult = String.valueOf(json);
                        System.out.println("JSON Result" + jsonresult);

                        String fbUserId = json.optString("id");
                        String fbUserFirstName = json.optString("name");
                        String fbUserEmail = json.optString("email");
                        //String fbUserProfilePics = "http://graph.facebook.com/" + fbUserId + "/picture?type=large";
                        Log.d("SignUpActivity", "Email: " + fbUserEmail + "\nName: " + fbUserFirstName + "\nID: " + fbUserId);
                    }
                    Log.d("SignUpActivity", response.toString());
                }
            });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,email,gender, birthday");
            request.setParameters(parameters);
            request.executeAsync();
        }

        @Override
        public void onCancel() {
            setResult(RESULT_CANCELED);
            Toast.makeText(SignUpActivity.this, "Login Attempt Cancelled", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(FacebookException error) {
            Toast.makeText(SignUpActivity.this, "An Error Occurred", Toast.LENGTH_LONG).show();
            error.printStackTrace();
        }
    });
Chydee
la source
0

Ajoutez cette ligne sur le bouton Cliquez sur

loginButton.setReadPermissions (Arrays.asList ("public_profile", "email", "user_birthday", "user_friends"));

adarsh
la source
-3

Utilisez la méthode statique FB getCurrentProfile () de la classe Profile pour récupérer ces informations.

 Profile profile = Profile.getCurrentProfile();
 String firstName = profile.getFirstName());
 System.out.println(profile.getProfilePictureUri(20,20));
 System.out.println(profile.getLinkUri());
Deepika
la source
39
La question concerne l'e-mail, l'anniversaire et le sexe. Cela ne répond à rien de tout cela.
Siamaster
2
cela ne donne pas d'email
vishal dharankar