Autorización de Android en Android: no se puede iniciar sesión cuando se instala la aplicación oficial de Facebook

Necesito iniciar sesión en Facebook y obtener los mismos campos, como el correo electrónico, etc. Uso el SDK de Facebook, y configuré mi clave de Android Hash en developers.facebook y configuré “Configurado para SSO de Android”. En el simulador y algunos dispositivos, la aplicación funciona bien.

Pero si la aplicación oficial de Facebook está instalada en el dispositivo, mi aplicación no funciona: presiono el botón de inicio de sesión, pero no veo un cuadro de diálogo con una vista web en la que me piden mi contraseña y mi inicio de sesión. Parece que el problema en Stack Overflow pregunta Usar Facebook.authorize con el SDK de Android no llama onActivityResult o Stack Overflow pregunta Android API única de inicio de sesión de API? , pero no puedo entender cómo resolverlo.

Mi código

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { this.facebookConnector.getFacebook().authorizeCallback(requestCode, resultCode, data); } public void getAccessToken() { SessionEvents.AuthListener listener = new SessionEvents.AuthListener() { @Override public void onAuthSucceed() { setupAccessToken(facebookConnector.getFacebook().getAccessToken()); } @Override public void onAuthFail(String error) { Toast.makeText(getApplicationContext(), getString(R.string.error_login), Toast.LENGTH_SHORT).show(); } }; SessionEvents.addAuthListener(listener); facebookConnector.login(); } 

código de facebookConnector

 public class FacebookConnector { public void login() { if (!facebook.isSessionValid()) { facebook.authorize(this.activity, this.permissions, new LoginDialogListener()); } } private final class LoginDialogListener implements DialogListener { public void onComplete(Bundle values) { SessionEvents.onLoginSuccess(); } public void onFacebookError(FacebookError error) { SessionEvents.onLoginError(error.getMessage()); } public void onError(DialogError error) { SessionEvents.onLoginError(error.getMessage()); } public void onCancel() { SessionEvents.onLoginError("Action Canceled"); } } } 

Por favor, actualice el siguiente código de su aplicación. Solucionará tu problema.

 public void loginAndPostToWall() { facebook.authorize(this, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener()); } 

Tuve el mismo problema que tú. Finalmente, resolví usar esto:

Abra Facebook.java proporcionado por Facebook SDK y luego cámbielo así:

 public void authorize(Activity activity, String[] permissions, int activityCode, final DialogListener listener) { boolean singleSignOnStarted = false; mAuthDialogListener = listener; /* // Prefer single sign-on, where available. if (activityCode >= 0) { singleSignOnStarted = startSingleSignOn(activity, mAppId, permissions, activityCode); } // Otherwise fall back to the traditional dialog. if (!singleSignOnStarted) { */ startDialogAuth(activity, permissions); // } } 

Esto es solo una suposición descabellada, pero en lugar de esto:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { this.facebookConnector.getFacebook().authorizeCallback(requestCode, resultCode, data); } 

Tratar:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); this.facebookConnector.getFacebook().authorizeCallback(requestCode, resultCode, data); } 

Como no está llamando al método principal, algunas cosas podrían no funcionar como se esperaba …

 private static Session openActiveSession(Activity activity, boolean allowLoginUI, StatusCallback callback, List permissions) { OpenRequest openRequest = new OpenRequest(activity).setPermissions(permissions).setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO).setCallback(callback); Session session = new Session.Builder(activity).build(); if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) { Session.setActiveSession(session); session.openForRead(openRequest); return session; } return null; } 

Edite su función de sesión abierta como esta