Android Facebook 4.0 SDK Cómo obtener correo electrónico, fecha de nacimiento y sexo del usuario

144

Estoy usando el siguiente código. Quiero la fecha de nacimiento, correo electrónico y género del usuario. Por favor ayuda. ¿Cómo recuperar esos datos?

Este es mi onViewCreated()interior del Fragmento.

@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);

}

Este es mi método de devolución de llamada.

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
fuente
Hola, @Sriyank, por favor, ayúdame si resolviste el problema. Quiero obtener la información de usuario del fragmento de inicio de sesión de Facebook después de que se haya completado el inicio de sesión. Quiero ir a la siguiente actividad. ¿Cómo puedo hacer eso?
Devendra Singh
la solución a continuación, pero tenga cuidado porque el correo electrónico puede estar vacío si el usuario ha iniciado sesión a través de su número de teléfono Visite stackoverflow.com/questions/29517667/… y stackoverflow.com/questions/29493486/…
pegaltier

Respuestas:

335

Esa no es la forma correcta de establecer los permisos, ya que los está sobrescribiendo con cada llamada al método.

Reemplace esto:

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

Con lo siguiente, como el método setReadPermissions()acepta una ArrayList:

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

También aquí se explica cómo consultar datos adicionales 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());
        }
    });
}

EDITAR:

Un posible problema es que Facebook asume que su correo electrónico no es válido. Para probarlo, use Graph API Explorer e intente obtenerlo. Si incluso allí no puede recibir su correo electrónico, cámbielo en la configuración de su perfil e intente nuevamente. Este enfoque resolvió este problema para algunos desarrolladores comentando mi respuesta.

Schwertfisch
fuente
2
Hola @Schwertfisch, ¿puedes mostrar cómo usar object.getString ("correo electrónico"); , sería muy útil para mí :)
Ajeet
3
¿Por qué recibo el error "Sin valor para el correo electrónico" a pesar de que ya lo configuré loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));?
stackex
1
@Schwertfisch en mi caso, no pude recibir mi correo electrónico incluso usando Graph API Explorer, así que agregué un correo electrónico alternativo a mi cuenta y funcionó, tal vez su correo electrónico no sea válido.
Kayan Almeida
1
@DevendraSingh tiene que obtener los valores y ponerlos en un extra, Intent myIntent = new Intent (this, SecondActivity.class); myIntent.putExtra ("email", object.getString ("email")) .... En la segunda actividad Bundle extras = getIntent (). GetExtras (); if (extras! = null) {email = extras.getString ("email"); } También puede tener una variable estática y asignar el valor. Lo siento por mi ingles. No sé si esta es la respuesta que quieres
schwertfisch
85
¡Solo tengo que decir que los documentos de Facebook son tan pobres! Es una pena que necesitemos saber cómo hacerlo aquí.
Gal Rom
13

Use este fragmento para obtener toda la información del perfil

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
fuente
12

No obtendrá el perfil onSuccess()que necesita implementar ProfileTrackerjunto con el registro de devolución de llamada

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

Tampoco olvides manejar el inicio y la parada del rastreador de perfil

Ahora tendrá un perfil para obtener AccessToken (resolvió el problema del perfil nulo). Solo tiene que usar " https://developers.facebook.com/docs/android/graph#userdata " para obtener cualquier información.

Ankit Bansal
fuente
1
Pero, ¿cuál es la sintaxis para obtener el correo electrónico dob y género? ¿Puedes decirme?
Sriyank Siddhartha
2
Lo obtengo como un token de acceso: {token de AccessToken: permisos ACCESS_TOKEN_REMOVED: [user_friends, email, user_birthday, basic_info]} Estoy usando este código en FacebookCallBack ---- AccessToken mAccessToken = loginResult.getAccessToken (); ¿Me puede decir qué significa? y cómo resolver este error y obtener el token de acceso?
Sriyank Siddhartha
@SriyankSiddhartha ¿Tienes alguna solución para esto? ¿Podrías actualizar aquí, enfrentando el mismo problema
Prabha1
@Sriyank, también estoy enfrentando el mismo problema, no puedo obtener la identificación del correo electrónico. Por favor, ayúdame si encuentras alguna solución. gracias por adelantado.
Ramesh
Todavía no puedo encontrar ninguna solución ... Actualmente sigo usando el SDK antiguo ... Avíseme si obtiene la solución ...
Gracias
8

Después de iniciar sesión

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
fuente
2

Esto funcionó para mí, espero ayudar a alguien (usando mi propio botón, no el botón de inicio de sesión de 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
fuente
2

El siguiente es el código para encontrar la identificación del correo electrónico, el nombre y la URL del perfil, 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
fuente
2

Aquí hay una solución que funciona (2019): ponga este código dentro de su lógica de inicio de sesión;

 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
fuente
0

Agregue esta línea en Haga clic en el botón

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

fuerte
fuente
-3

Utilice el método estático FB getCurrentProfile () de la clase Profile para recuperar esa información.

 Profile profile = Profile.getCurrentProfile();
 String firstName = profile.getFirstName());
 System.out.println(profile.getProfilePictureUri(20,20));
 System.out.println(profile.getLinkUri());
Deepika
fuente
39
La pregunta es sobre correo electrónico, cumpleaños y género. Esto no responde nada de eso.
Siamaster
2
esto no da correo electrónico
vishal dharankar