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:
- Retrofit - eliminando algunos caracteres inválidos del cuerpo de respuesta antes de analizarlo como json
- Cómo obtener una excepción NullPointerException al analizar JSON
- ¿Cuál usar? JSONObject de org.json VS JsonObject de javax.json
- Error StrictMode $ AndroidBlockGuardPolicy.onNetwork
- Pasando el objeto JSON en la URL del servicio Web RESTFUL en Android?
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)?
- Convertir Facebook JSON created_time de formato String a formato largo
- Android - Https conexión a un servicio WCF de .NET da SSLException: "Ningún certificado de compañero"
- ¿Cómo puedo obtener la respuesta JSON de una solicitud POST en un WebView?
- Parse json array android
- Consumir servicios REST en Android, la forma más fácil?
- JSONArray respuesta con Volley para Android
- Android Facebook Graph api información básica que solicita
- Cómo construir un servidor de notificación push de Android en PHP
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()
.