Establecer permiso para obtener el ID de correo electrónico del usuario desde Facebook

Estoy usando Facebook 3.0 SDK para Android. Tengo que implementar Facebook inicio de sesión. Estoy accediendo a la información básica del usuario como nombre, userID. Pero también quiero tener acceso al correo electrónico del usuario. He pasado por muchos blogs y foro, pero no puedo averiguar cómo hacerlo.

Estoy usando mi propio botón android para iniciar sesión no com.facebook.widget.LoginButton . Si utilizo el botón de inicio de sesión de Facebook era fácil sólo tienes que usar estas líneas:

 authButton.setReadPermissions(Arrays.asList("basic_info","email")); 

Pero, tengo mi propio requisito, tendrá que ir con los botones predeterminados android. Esto es lo que he hecho hasta ahora:

 Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest( this, Arrays.asList("email")); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLogin = (Button) findViewById(R.id.logIn); mLogin.setOnClickListener(this); } @Override public void onClick(View v) { // start Facebook Login Session.openActiveSession(this, true, new Session.StatusCallback() { // callback when session changes state @Override public void call(final Session session, SessionState state, Exception exception) { if (session.isOpened()) { session.requestNewReadPermissions(newPermissionsRequest); // make request to the /me API Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { // callback after Graph API response with user // object @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { System.out .println("Facebook Response: " + response.toString()); access_token = session.getAccessToken(); firstName = user.getFirstName(); fb_user_id = user.getId(); System.out .println("Facebook Access token: " + access_token); System.out.println("First Name:" + firstName); System.out.println("FB USER ID: " + fb_user_id); } } }); } } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } 

Puedo obtener todas las cosas que estoy imprimiendo en el registro, pero no pude recuperar el correo electrónico del perfil de usuario.

¿Qué puedo hacer por esto?

Cualquier tipo de ayuda será apreciada.

Resuelto: Aquí es lo que he hecho …

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLogin = (Button) findViewById(R.id.logIn); mLogin.setOnClickListener(this); } @Override public void onClick(View v) { Session currentSession = Session.getActiveSession(); if (currentSession == null || currentSession.getState().isClosed()) { Session session = new Session.Builder(context).build(); Session.setActiveSession(session); currentSession = session; } if (currentSession.isOpened()) { // Do whatever u want. User has logged in } else if (!currentSession.isOpened()) { // Ask for username and password OpenRequest op = new Session.OpenRequest((Activity) context); op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); op.setCallback(null); List<String> permissions = new ArrayList<String>(); permissions.add("publish_stream"); permissions.add("user_likes"); permissions.add("email"); permissions.add("user_birthday"); op.setPermissions(permissions); Session session = new Builder(MainActivity.this).build(); Session.setActiveSession(session); session.openForPublish(op); } } public void call(Session session, SessionState state, Exception exception) { } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (Session.getActiveSession() != null) Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); Session currentSession = Session.getActiveSession(); if (currentSession == null || currentSession.getState().isClosed()) { Session session = new Session.Builder(context).build(); Session.setActiveSession(session); currentSession = session; } if (currentSession.isOpened()) { Session.openActiveSession(this, true, new Session.StatusCallback() { @Override public void call(final Session session, SessionState state, Exception exception) { if (session.isOpened()) { Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { TextView welcome = (TextView) findViewById(R.id.welcome); welcome.setText("Hello " + user.getName() + "!"); access_token = session .getAccessToken(); firstName = user.getFirstName(); fb_user_id = user.getId(); System.out .println("Facebook Access token: " + access_token); System.out.println("First Name:" + firstName); System.out.println("FB USER ID: " + fb_user_id); } } }); } } }); } } 

Ahora puedo obtener permiso de correo electrónico con el resto del permiso de publicación.

Marcando esto como una respuesta aceptada para que pueda ayudar a otros.

TL; DR: use algo como esto para obtener el correo electrónico:

 String email = (String) user.getProperty("email"); 

Tengo un comentario sobre tu código. Dado que "correo electrónico" es un permiso de lectura, no es necesario crear una solicitud de permiso por separado para obtenerlo. Usted puede hacer algo como esto (código no probado, por lo que puede haber errores leves):

 Session s = new Session(this); Session.setActiveSession(s); Session.OpenRequest request = new Session.OpenRequest(this); request.setPermissions(Arrays.asList("basic_info","email")); request.setCallback( /* your callback here */ ); s.openForRead(request); 

Y puede deshacerse de la nueva solicitud de permiso en su devolución de llamada.

  • El botón de inicio de sesión de Facebook no está ejecutando la devolución de llamada al hacer clic
  • Cómo cambiar el idioma de com.facebook.widget.LoginButton en Android
  • Facebook Android SDK 4.0.0 no obtener información del perfil
  • SessionState es CLOSED_LOGIN_FAILED en el inicio de sesión nativo de FB
  • Facebook SDK 4.0 LoginButton - setReadPermissions no funciona?
  • Pantalla de inicio de Android Facebook no hay teclado
  • Prácticas recomendadas (lo mejor para Android): autenticar a un usuario con acceso a Facebook o Google
  • Android facebook Api Exception
  • SDK de Android Facebook: el hash de clave no coincide con ningún hash de clave almacenado al cargar Google Play
  • La devolución de llamada de Facebook LoginButton no se llama
  • android - cómo cambiar el texto en facebook botón de inicio de sesión
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.