Obtener correo electrónico de Facebook después de iniciar sesión en Android

Aquí está mi código realizando la conexión.

import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.widget.ProgressBar; import android.widget.TextView; import com.facebook.android.AsyncFacebookRunner; import com.facebook.android.AsyncFacebookRunner.RequestListener; import com.facebook.android.DialogError; import com.facebook.android.Facebook; import com.facebook.android.Facebook.DialogListener; import com.facebook.android.FacebookError; import com.facebook.android.Util; public class FacebookConnect extends Activity{ public static final String TAG = "FACEBOOK"; private Facebook mFacebook; public static final String APP_ID = "XXX"; private AsyncFacebookRunner mAsyncRunner; private static final String[] PERMS = new String[] { "read_stream" }; private SharedPreferences sharedPrefs; private Context mContext; private TextView username; private ProgressBar pb; String fbId, fbName, fbEmail; public void setConnection() { mContext = this; mFacebook = new Facebook(APP_ID); mAsyncRunner = new AsyncFacebookRunner(mFacebook); } public void getID(TextView txtUserName, ProgressBar progbar) { username = txtUserName; pb = progbar; if (isSession()) { Log.d(TAG, "sessionValid"); mAsyncRunner.request("me", new IDRequestListener()); } else { // no logged in, so relogin Log.d(TAG, "sessionNOTValid, relogin"); mFacebook.authorize(this, PERMS, new LoginDialogListener()); } } public boolean isSession() { sharedPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); String access_token = sharedPrefs.getString("access_token", "x"); Long expires = sharedPrefs.getLong("access_expires", -1); Log.d(TAG, access_token); if (access_token != null && expires != -1) { mFacebook.setAccessToken(access_token); mFacebook.setAccessExpires(expires); } return mFacebook.isSessionValid(); } private class LoginDialogListener implements DialogListener { @Override public void onComplete(Bundle values) { Log.d(TAG, "LoginONComplete"); String token = mFacebook.getAccessToken(); long token_expires = mFacebook.getAccessExpires(); Log.d(TAG, "AccessToken: " + token); Log.d(TAG, "AccessExpires: " + token_expires); sharedPrefs = PreferenceManager .getDefaultSharedPreferences(mContext); sharedPrefs.edit().putLong("access_expires", token_expires).commit(); sharedPrefs.edit().putString("access_token", token).commit(); mAsyncRunner.request("me", new IDRequestListener()); } @Override public void onFacebookError(FacebookError e) { Log.d(TAG, "FacebookError: " + e.getMessage()); } @Override public void onError(DialogError e) { Log.d(TAG, "Error: " + e.getMessage()); } @Override public void onCancel() { Log.d(TAG, "OnCancel"); } } private class IDRequestListener implements RequestListener { @Override public void onComplete(String response, Object state) { try { Log.d(TAG, "IDRequestONComplete"); Log.d(TAG, "Response: " + response.toString()); JSONObject json = Util.parseJson(response); fbId = json.getString("id"); fbName = json.getString("name"); //fbEmail = json.getString("email"); FacebookConnect.this.runOnUiThread(new Runnable() { public void run() { username.setText("Welcome: " + name + "\n ID: " + fbId); pb.setVisibility(ProgressBar.GONE); } }); } catch (JSONException e) { Log.d(TAG, "JSONException: " + e.getMessage()); } catch (FacebookError e) { Log.d(TAG, "FacebookError: " + e.getMessage()); } } @Override public void onIOException(IOException e, Object state) { Log.d(TAG, "IOException: " + e.getMessage()); } @Override public void onFileNotFoundException(FileNotFoundException e, Object state) { Log.d(TAG, "FileNotFoundException: " + e.getMessage()); } @Override public void onMalformedURLException(MalformedURLException e, Object state) { Log.d(TAG, "MalformedURLException: " + e.getMessage()); } @Override public void onFacebookError(FacebookError e, Object state) { Log.d(TAG, "FacebookError: " + e.getMessage()); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { mFacebook.authorizeCallback(requestCode, resultCode, data); } } 

Como respuesta, obtengo un JSON. Ejemplo:

 08-15 14:22:42.160: DEBUG/FACEBOOK(1258): Response: {"id":"3159628280","name":"Peter Black","first_name":"Peter","last_name":"Black","link":"http:\/\/www.facebook.com\/Peter.Black","username":"Peter.Black","gender":"male","timezone":3,"locale":"bg_BG","verified":true,"updated_time":"2011-08-14T08:42:59+0000"} 

Mi pregunta es ¿cómo puedo obtener el correo electrónico del usuario (el correo electrónico con el que se registra en Facebook)?

Necesita el permiso de email para leer la dirección de correo electrónico de los usuarios. Esto agregará una etiqueta de correo electrónico en tu json-response de [uid] o de me peticiones.

correo electrónico

Proporciona acceso a la dirección de correo electrónico principal del usuario en la propiedad de correo electrónico. No spam usuarios. Su uso del correo electrónico debe cumplir con las políticas de Facebook y con la Ley CAN-SPAM.

Fuente: Permisos

Hágalo cuando haga clic en el botón Inicio de sesión:

  OpenRequest openRequest = new OpenRequest(this); List<String> readPermissions = new ArrayList<String>(); readPermissions.add("email"); openRequest.setPermissions(readPermissions); openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); openRequest.setCallback(statusCallback); session.openForRead(openRequest); 

Otra opción para recuperar correo electrónico en Facebook SDK 3.0.x es mediante el uso de esta biblioteca de código abierto:

Android-simple-facebook
https://github.com/sromku/android-simple-facebook

  • Primero, use este permiso

     Permissions.EMAIL 
  • Entonces, ingrese

     mSimpleFacebook.login(MainActivity.this); 
  • Y luego, obtener el perfil

     mSimpleFacebook.getProfile(new OnProfileRequestAdapter() { @Override public void onComplete(Profile profile) { String id = profile.getId(); String firstName = profile.getFirstName(); String birthday = profile.getBirthday(); String email = profile.getEmail(); String bio = profile.getBio(); // ... and many more properties of profile ... } }); 

Ejemplos completos se explican aquí, incluyendo material de permisos y otros métodos simplificados (como: publicar feeds, obtener amigos y más …)

Antes de llamar Session.openActiveSession hacer esto para obtener permisos agregar esto:

 List<String> permissions = new ArrayList<String>(); permissions.add("email"); 

El último parámetro en Session.openActiveSession() debería ser permisos. Ahora puede acceder a user.getProperty("email").toString() .

  • Google Services Plugin no puede funcionar sin google-services.json
  • Convertir objeto complejo de Java en Json
  • cómo guardar datos de json en sqlite en android
  • Rellenar Listview de JSON
  • Publicar datos de objetos de Json para obtener la respuesta de array de Json utilizando volley en android
  • Cargando JSON de String en JSONArray en Android
  • Org.json.JSONException: Cadena no terminada en el carácter 1834
  • ¿Está google gson funcionando en android?
  • Cómo obtener respuesta como String utilizando retrofit sin utilizar GSON o cualquier otra biblioteca en android
  • JSON válido sigue recibiendo error de análisis
  • Jackson ObjectMapper con claves JSON arbitrarias
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.