Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Facebook onCompleted Email java.lang.NullPointerException

Puedo conseguir todas esas cosas según lo demostrado en mi código abajo, pero no poder recuperar el email del perfil de usuario.

¿Qué puedo hacer por esto?

Cualquier tipo de ayuda será apreciada.

Anteriormente estaba usando esta fuente para obtener detalles del usuario de Facebook y estaba buscando datos (incluido el correo electrónico) sin ningún problema:

public class MainActivity extends Activity { private Session.StatusCallback sessionStatusCallback; private Session currentSession; private Button login; private Button logout; private Button publishButton; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); // create instace for sessionStatusCallback sessionStatusCallback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); } }; login = (Button) findViewById(R.id.loginButton); login.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { connectToFB(); } }); logout = (Button) findViewById(R.id.logoutButton); logout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (currentSession != null) { currentSession.closeAndClearTokenInformation(); ... } } }); // publish button publishButton = (Button) findViewById(R.id.publishButton); publishButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { publishStory(); } }); } public void connectToFB() { List<String> permissions = new ArrayList<String>(); permissions.add("publish_actions"); currentSession = new Session.Builder(this).build(); currentSession.addCallback(sessionStatusCallback); Session.OpenRequest openRequest = new Session.OpenRequest( MainActivity.this); openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); openRequest.setRequestCode(Session.DEFAULT_AUTHORIZE_ACTIVITY_CODE); openRequest.setPermissions(permissions); currentSession.openForPublish(openRequest); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (currentSession != null) { currentSession .onActivityResult(this, requestCode, resultCode, data); } } private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (session != currentSession) { return; } if (state.isOpened()) { // Log in just happened. Toast.makeText(getApplicationContext(), "session opened", Toast.LENGTH_SHORT).show(); Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { String fbId = user.getId(); String fbName = user.getName(); String gender = user.asMap().get("gender").toString(); String email = user.asMap().get("email").toString(); String first = user.asMap().get("first_name").toString(); String last = user.asMap().get("last_name").toString(); textView.setText("Id: " + fbId + ", Name: " + fbName + ", Gender: " + gender + ", EmailID: " + email + ", First: " + first + ", Last: " + last); } }); } else if (state.isClosed()) { // Log out just happened. Update the UI. Toast.makeText(getApplicationContext(), "session closed", Toast.LENGTH_SHORT).show(); } } public void publishStory() { .... } } 

Y ahora estoy usando el mismo código en uno de mis proyectos, pero siempre recibiendo:

 E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.NullPointerException at comMainActivity$5.onCompleted(MainActivity.java:262) at com.facebook.Request$1.onCompleted(Request.java:303) at com.facebook.Request$4.run(Request.java:1726) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4921) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) 

En esta línea, estoy recibiendo NPE :

  String email = user.asMap().get("email").toString(); 

Código:

 public class MainActivity extends Activity { Button btnFBLogin, btnGPLogin; private Session.StatusCallback sessionStatusCallback; private Session currentSession; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.screen_layout); sessionStatusCallback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); } }; btnFBLogin = (Button) findViewById(R.id.loginFB); btnFBLogin.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub connectToFB(); } }); } public void connectToFB() { List<String> permissions = new ArrayList<String>(); permissions.add("publish_actions"); currentSession = new Session.Builder(this).build(); currentSession.addCallback(sessionStatusCallback); Session.OpenRequest openRequest = new Session.OpenRequest( MainActivity.this); openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); openRequest.setRequestCode(Session.DEFAULT_AUTHORIZE_ACTIVITY_CODE); openRequest.setPermissions(permissions); currentSession.openForPublish(openRequest); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (currentSession != null) { currentSession .onActivityResult(this, requestCode, resultCode, data); } } private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (session != currentSession) { return; } if (state.isOpened()) { // Log in just happened. Toast.makeText(getApplicationContext(), "session opened", Toast.LENGTH_SHORT).show(); Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { String fbId = user.getId(); String fbName = user.getName(); String gender = user.asMap().get("gender").toString(); String email = user.asMap().get("email").toString(); String first = user.asMap().get("first_name").toString(); String last = user.asMap().get("last_name").toString(); Toast.makeText(MainActivity.this, "EmailId:- "+email, Toast.LENGTH_LONG).show(); } }); } else if (state.isClosed()) { // Log out just happened. Update the UI. Toast.makeText(getApplicationContext(), "session closed", Toast.LENGTH_SHORT).show(); } } } 

¿Cuál podría ser la razón? ¿Por qué está sucediendo?

  • Inicio de sesión de Facebook en el fragmento en android
  • ¿Cómo detectar un evento de cierre de sesión con la API de Android de Facebook v4?
  • La aplicación proxy no puede solicitar permisos de publicación sin haber sido instalados previamente
  • Error de inicio de sesión: hay un error al iniciar sesión en esta aplicación. Por favor, inténtelo de nuevo más tarde
  • "Error de cookies no habilitado" en algunos dispositivos
  • Botón de inicio personalizado de Facebook en el estudio android
  • Inicio de sesión de Facebook: finaliza un error de hash de clave no válido, al intentar iniciar sesión de nuevo
  • El inicio de sesión de Facebook falla en algunos dispositivos
  • 2 Solutions collect form web for “Facebook onCompleted Email java.lang.NullPointerException”

    En algún momento podría suceder que el usuario no establezca su ID de correo electrónico en su perfil que usted está recibiendo en su Facebook de acceso a través de Android para que arroja error como la excepción de puntero nulo.

    Por lo que debe tener que comprobar antes de utilizar la variable de correo electrónico después de buscar desde el inicio de sesión que es nulo o no Tales como:

     String email =""; if(user.asMap().get("email") != null){ email = user.asMap().get("email").toString(); } 

    Debe agregar "correo electrónico" a la lista de permisos que necesita, de lo contrario el correo electrónico siempre será nulo. No sé qué versión de la sdk que está utilizando. Con el último usted puede escribir:

     Collection<String> mPermissions = new ArrayList<>(); mPermissions.add("email"); LoginManager mLoginManager = LoginManager.getInstance(); CallbackManager mCallbackManager = CallbackManager.Factory.create(); FbCallback fbCallback = new FbCallback(this); mLoginManager.registerCallback(mCallbackManager, fbCallback); [...] mLoginManager.logInWithReadPermissions(this, mPermissions); 

    Por cierto … recuerde que el usuario puede revocar el permiso o no puede concederlo durante el 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.