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:
- Esta aplicación no tiene hashes de clave de Android configurados. - Inicie sesión con Facebook SDK
- ¿Cómo obtener el token de acceso actual en Facebook Android SDK V4?
- Facebook - Android autoriza el error de la aplicación
- Acceso a Facebook en el navegador de celulares a través de la aplicación de Facebook
- LoginButton pidiendo permiso de lista de amigos, ¿por qué?
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.
- El estado de Facebook no se actualizó. Error 403, error de autenticación, SocialAuthException en Android
- Botón de inicio personalizado de Facebook en el estudio android
- "Argumento 'contexto' no puede ser nulo"
- Facebook Login CallbackManager FacebookCallback llamado onCancel () cada vez
- Inicio de sesión de Android Facebook SDK 4.0 con LoginManager
- Facebook Login No Regresar Usuario access_token
- Cómo cambiar la altura del botón 'Iniciar sesión con Facebook'?
- Error de permiso publish_actions
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.
- Android ImageView Zoom-in y Zoom-out continuamente
- ¿Cómo evitar la dirección automática de texto de derecha a izquierda para el hebreo y el árabe?