android facebook facebook-login facebook-sdk-4.0

android - FacebookCallback.onCancel recibe una llamada cuando se intenta iniciar sesión con Facebook SDK



facebook-login facebook-sdk-4.0 (7)

El comentario de @Doru me llevó a la solución. Utilicé la actividad de Facebook en lugar del fragmento.

En lugar de

<activity android:name="com.facebook.FacebookActivity" android:screenOrientation="portrait" android:launchMode="singleTask" />

Necesitaba escribir

<activity android:name="com.facebook.FacebookActivity" android:screenOrientation="portrait" />

Lo malo de este error, es que solo ocurre en las versiones anteriores de Android (por ejemplo, 4.4.2, no 5.0).

Tengo una aplicación para Android y estoy tratando de usar el SDK de Facebook (versión 4.1.0) para obtener un token e iniciar sesión. Aquí está mi código:

public class LoginActivity extends Activity { private CallbackManager callbackManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); FacebookSdk.sdkInitialize(getApplicationContext()); callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { AccessToken accessToken = loginResult.getAccessToken(); Log.v(TAG, "Facebook login was successful"); String authToken = accessToken.getToken(); // User authToken here: } @Override public void onCancel() { Log.v(TAG, "Facebook login was canceled"); } @Override public void onError(FacebookException e) { Log.e(TAG, "Facebook login failed: " + e.getMessage()); } }); Button facebook_button = (Button) findViewById(R.id.fbButton); facebook_button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { LoginManager.getInstance().logInWithReadPermissions(getActivity(), Arrays.asList("public_profile")); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); } }

El código cambió a la aplicación de Facebook y viceversa y se llama a OnActivityResult() . Sin embargo, cada vez que el método de devolución de llamada que se llama es onCancel() . Tenga en cuenta que no estoy usando el LoginButton proporcionado por Facebook, y tengo mi propio botón (aunque probé ese enfoque y el resultado fue el mismo). Revisé doble y triple la ID de mi aplicación y el keyhash generado por la aplicación y también se ven correctos. Por lo tanto, no sé qué más puede estar mal. Cualquier ayuda en este punto es muy apreciada.


El problema era simplemente porque la ID de la aplicación tenía que estar entre comillas dobles.


La razón detrás de este comportamiento es que ya está conectado. Por lo tanto, cuando lo revoca, se llama a oncancel () en lugar de onsubmit (). Así que simplemente ejecuta el cierre de sesión en el botón de cierre de sesión de tu aplicación como este

Importar ->

import com.facebook.login.LoginManager;

Implementación ->

LoginManager.getInstance().logOut();


Si alguien se encuentra con esto en el futuro, esto también puede ser causado por la aplicación nativa de Facebook instalada en el dispositivo que bloquea el inicio de sesión debido a la razón X.

En mi caso, esto se lanzaba cada vez que intentaba iniciar sesión. Finalmente, cambié a la aplicación nativa de Facebook y cuando se abrió, requirió autenticación y me hizo iniciar sesión nuevamente debido a alguna "actividad sospechosa" (creo que cambié mi número recientemente).

Si está haciendo todo lo que se menciona arriba y los usuarios todavía se quejan de ello (y tienen la aplicación instalada, puede usar el código en la parte inferior para ver si la aplicación de Facebook está instalada :) es posible que desee incluir un cuadro de diálogo que les pide que verifiquen la aplicación de Facebook y se aseguren de que todavía estén conectados, lo que luego les pedirá que corrijan cualquier error antes de volver a ingresar a su aplicación.

//Code to check if Facebook app is installed: public static boolean doesUserHaveFacebookAppInstalled(Context context){ try{ context.getPackageManager().getApplicationInfo("com.facebook.katana", 0 ); return true; } catch( PackageManager.NameNotFoundException e ){ return false; } }


Tuve el mismo problema, finalmente encontré el problema. La actividad que llama fragmento de inicio de sesión de facebook tenía android:launchMode="singleInstance" en el archivo de manifiesto.


sí, estaba enfrentando el mismo problema, lo resolví utilizando el siguiente código justo antes de iniciar sesión

LoginManager.getInstance().logOut();


@Override public void onCancel() { accessToken = AccessToken.getCurrentAccessToken(); if (accessToken == null) { Toast.makeText(LoginActivity.this, "Login unSuccessful..Please contact developer... ", Toast.LENGTH_LONG).show(); } else { Toast.makeText(LoginActivity.this, "Login Successful. ", Toast.LENGTH_LONG).show(); } } @Override public void onError(FacebookException error) { Toast.makeText(getApplicationContext(), "Login attempt failed.", Toast.LENGTH_SHORT).show(); }

  • Elemento de lista