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

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

Este es mi onViewCreated() dentro 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 callback.

 private FacebookCallback mFacebookCallback = new FacebookCallback() { @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); } }; 

    Esa no es la forma correcta de establecer los permisos ya que los sobrescribe con cada llamada a 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í está 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() { @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 supone 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 y vuelva a intentarlo. Este enfoque resolvió este problema para algunos desarrolladores que comentaban mi respuesta.

    No obtendrá Profile en onSuccess() , necesita implementar ProfileTracker junto con el registro de callback

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

    Además, no te olvides de manejar el inicio y la detención del rastreador de perfil

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

    Utiliza este fragmento para obtener toda la información de perfil

     private FacebookCallback callback = new FacebookCallback() { @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) { } }; 

    Puede usar la clase GraphRequest para emitir llamadas a la API Graph de Facebook para obtener información del usuario. Consulte https://developers.facebook.com/docs/android/graph para obtener más información.

    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(); } 

    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() { @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")); } } 

    A continuación se muestra el código para encontrar el id. De 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() { @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); } 

    Use el método estático de 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());