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