android facebook facebook-graph-api facebook-sdk-4.x

Facebook Android SDK 4.5.0 obtener la dirección de correo electrónico



facebook-graph-api facebook-sdk-4.x (7)

Información

Si está dando algún permiso para obtener una dirección de correo electrónico. luego, Facebook no puede darle direcciones de correo electrónico u otros detalles.

cuando, el usuario de Facebook no se registra con su dirección de correo electrónico. Entonces Facebook no puede proporcionarle su dirección de correo electrónico.

si el usuario inicia sesión con Facebook usando la dirección de correo electrónico, Facebook se lo enviará por correo electrónico.

Facebook SDK proporciona solo detalles públicos.

compruebe un inicio de sesión con Facebook usando la dirección de correo electrónico y también con el número de teléfono a través de.

Actualmente estoy creando una aplicación de prueba para probar usando el último SDK de Facebook para actualizar nuestro problema de aplicación existente. Necesito obtener la dirección de correo electrónico que sé que depende si el usuario ha proporcionado una en su cuenta. Ahora la cuenta que estoy usando para probar proporciona una segura, pero por razones desconocidas, el SDK de Facebook solo proporciona el user_id y el nombre completo de la cuenta y nada más. Estoy confundido sobre esto ya que el SDK3 y versiones posteriores brindan más información que el SDK4 actualizado y no sé cómo obtener el correo electrónico, ya que todas las respuestas que he visto hasta ahora no proporcionan el correo electrónico de mi parte. Aquí está mi código hasta ahora:

Botón Iniciar sesión

@OnClick(R.id.btn_login) public void loginFacebook(){ LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email")); }

Devolución de llamada de LoginManager:

LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { requestUserProfile(loginResult); } @Override public void onCancel() { Toast.makeText(getBaseContext(),"Login Cancelled", Toast.LENGTH_SHORT).show(); } @Override public void onError(FacebookException e) { Toast.makeText(getBaseContext(),"Problem connecting to Facebook", Toast.LENGTH_SHORT).show(); } });

Y la solicitud de perfil de usuario:

public void requestUserProfile(LoginResult loginResult){ GraphRequest.newMeRequest( loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject me, GraphResponse response) { if (response.getError() != null) { // handle error } else { try { String email = response.getJSONObject().get("email").toString(); Log.e("Result", email); } catch (JSONException e) { e.printStackTrace(); } String id = me.optString("id"); // send email and id to your web server Log.e("Result1", response.getRawResponse()); Log.e("Result", me.toString()); } } }).executeAsync(); }

La respuesta JSON devuelve solo la ID y el nombre completo de mi cuenta, pero no incluye el correo electrónico. ¿Me perdí algo?


Debe solicitar parámetros a Facebook para obtener sus datos. Aquí publico mi función donde obtengo los datos de Facebook. La clave está en esta línea:

parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook

Espero que te ayude

btnLoginFb.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { System.out.println("onSuccess"); progressDialog = new ProgressDialog(LoginActivity.this); progressDialog.setMessage("Procesando datos..."); progressDialog.show(); String accessToken = loginResult.getAccessToken().getToken(); Log.i("accessToken", accessToken); GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { Log.i("LoginActivity", response.toString()); // Get facebook data from login Bundle bFacebookData = getFacebookData(object); } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { System.out.println("onCancel"); } @Override public void onError(FacebookException exception) { System.out.println("onError"); Log.v("LoginActivity", exception.getCause().toString()); } }); private Bundle getFacebookData(JSONObject object) { try { Bundle bundle = new Bundle(); String id = object.getString("id"); try { URL profile_pic = new URL("https://graph.facebook.com/" + id + "/picture?width=200&height=150"); Log.i("profile_pic", profile_pic + ""); bundle.putString("profile_pic", profile_pic.toString()); } catch (MalformedURLException e) { e.printStackTrace(); return null; } bundle.putString("idFacebook", id); if (object.has("first_name")) bundle.putString("first_name", object.getString("first_name")); if (object.has("last_name")) bundle.putString("last_name", object.getString("last_name")); if (object.has("email")) bundle.putString("email", object.getString("email")); if (object.has("gender")) bundle.putString("gender", object.getString("gender")); if (object.has("birthday")) bundle.putString("birthday", object.getString("birthday")); if (object.has("location")) bundle.putString("location", object.getJSONObject("location").getString("name")); return bundle; } catch(JSONException e) { Log.d(TAG,"Error parsing JSON"); } return null; }


En lugar de obtener el valor de graphResponse , acceda al correo electrónico usando JSONObject me

userEmail = jsonObject.getString("email");


Espero que te ayude

/*** setupFacebook stuff like make login with facebook and get the userId,Name and Email*/ private void setupFacebookStuff() { Log.e(TAG, "key hash= " + Utils.getKeyHash(SplashActivity.this, getPackageName())); // This should normally be on your application class FacebookSdk.sdkInitialize(SplashActivity.this); accessTokenTracker = new AccessTokenTracker() { @Override protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) { currentAccessToken.getToken(); } }; loginManager = LoginManager.getInstance(); callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { preference.setUserLogin(true); final GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { try { Log.e("id", "" + object); if (object.has(getString(R.string.fbParamId))) { final String userId = object.optString(getString(R.string.fbParamId)); final String userPicture = "https://graph.facebook.com/" + object.optString(getString(R.string.fbParamId)) + "/picture?type=large"; preference.setUserId(userId); preference.setUserPictureUrl(userPicture); } if (object.has(getString(R.string.fbParamUserName))) { final String userName = object.optString(getString(R.string.fbParamUserName)); preference.setUserName(userName); } if (object.has(getString(R.string.fbParamEmail))) { final String userEmail = object.optString(getString(R.string.fbParamEmail)); preference.setUserName(userEmail); Log.e("useremail", userEmail); } callMainActivity(true); } catch (Exception e) { e.printStackTrace(); } } }); final Bundle parameters = new Bundle(); parameters.putString("fields", "name,email,id"); request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { Toast.makeText(getBaseContext(), "Login Cancelled", Toast.LENGTH_SHORT).show(); } @Override public void onError(FacebookException error) { Toast.makeText(getBaseContext(), "Problem connecting to Facebook", Toast.LENGTH_SHORT).show(); Log.e(TAG, "Facebook login error " + error); } }); }


Poniendo este código:

btnLoginFb.setReadPermissions(Arrays.asList("email"));

antes de

RegisterCallback

debería resolver el problema


Supongo que recibir los permisos de correo electrónico puede ayudar ...

LoginManager.getInstance().logInWithReadPermissions( fragmentOrActivity, Arrays.asList("email"));


También puede usar el objeto GraphResponse para obtener los valores

LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { GraphRequest request = GraphRequest.newMeRequest( loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { Log.v("LoginActivity", response.toString()); try { // Application code String email = response.getJSONObject().getString("email"); txtStatus.setText("Login Success /n" + email); }catch(Exception e){ e.printStackTrace();; } } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id,name,email,gender,birthday"); request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { txtStatus.setText("==============Login Cancelled============="); } @Override public void onError(FacebookException exception) { txtStatus.setText("==============Login Error================="); exception.printStackTrace(); } });