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


Autorización para Android Facebook SDK 3.0

Realmente estoy siguiendo ejemplo de SessionLoginFragment.java de muestras de sdk de facebook.

Lo que realmente no entiendo es esto:

Cuando hago

session.openForRead(new Session.OpenRequest(fragment).setCallback(statusCallback)); 

Para registrar mi usuario en facebook y pedir permiso de lectura básico (sólo para probar la integración) simplemente no funciona.

Cavé un poco con el depurador y seguí el camino. Si no pone un requestCode en el OpenRequest de la sesión, se le dará un random (y esto está bien).

OpenForRead (mi sesión actual está en estado CREATED) creará el diálogo de permisos. Cuando pulsa el botón "Ok", realizará una

 request.getStartActivityDelegate().startActivityForResult(intent, request.getRequestCode()); 

Puede ver el código del código fuente fb sdk. Bueno, el requestCode es el mismo de la sesión (y aquí está bien).

Cuando fb log en el sistema que va a terminar su facebook.LoginActivity y me llaman de nuevo mi onActivityResult en mi actividad. El problema es que aquí el requestCode es diferente al de la petición. Y no sé por qué y de dónde viene!

Si entro en mi cuenta fb mi aplicación está allí, por lo que significa que he hecho el flujo correcto de autenticación que terminan bien. Pero no conseguiré correctamente autenticado de mi app debido a este problema.

¿Sabes por qué y cómo puedo solucionarlo?

Gracias.

ACTUALIZACIÓN CON DETALLE DE FLUJO:

Este es el flujo real (del fragmento ):

 session.openForRead(new Session.OpenRequest(fragment).setCallback(statusCallback)); 

Después de crearlo, el código de solicitud es (siempre) 64206 Ahora el flujo openForRead llamará (parte final)

 request.getStartActivityDelegate().startActivityForResult(intent, request.getRequestCode()); 

Que llamar a la LoginActivity de facebook SDK y hacer la validación de cliente / servidor / oauth

Ahora en mi actividad se llama onActivityResult (no en el fragmento, sino en la parte de la actividad)

Y aquí llamo

 Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data); 

Y aquí el requestCode es requestCode 129742

¿Como es posible? Como ya he dicho, el problema en todo este flujo es que requestCode devuelto a onActivityResult es diferente de mi requestCode pendingRequest y este break (getActiveSession (). OnActivityResult devuelve sin ejecutar código) la parte del cliente de inicio de sesión.

  • Cómo funciona el cierre de sesión en Facebook SDK Android
  • Errores de Facebook relacionados con auth.extendSSOAccessToken
  • Ejemplos oficiales de Facebook se bloquean (GraphApiSample)
  • Facebook LoginButton para Android no toma los valores de login_text y logout_text pasados ​​de XML
  • Android facebook sdk no llama a la devolución de llamada después de iniciar sesión
  • La clave de la aplicación de Android no coincide con ninguna hash de clave almacenada
  • Autenticación de Facebook sin botón de inicio de sesión
  • Facebook android shareDialog se cierra después de abrir
  • 2 Solutions collect form web for “Autorización para Android Facebook SDK 3.0”

    Me encontré con el mismo problema, excepto que en mi caso el 326350 ofensivo fue 326350 ( 0x4face ). Y yo estaba llamando a super.onActivityResult , por lo que la solución propuesta por Eric Savage ya estaba en su lugar, pero no es eficaz. Lo más curioso de todo, este material funcionó hace sólo un par de semanas, y el comportamiento ofensivo apareció sin mi mismo actualizar nada (la versión de SDK de Facebook, la versión de Android, la versión de la biblioteca de soporte, incluso el teléfono en el que estoy desarrollando / Todo lo mismo que cuando lo tenía trabajando).

    Sin embargo, la respuesta de Eric contiene otras sugerencias interesantes, que exploté para hacer que mi código funcionara de nuevo. Básicamente, en lugar de pasar todo el requestCode a Session.onActivityResult , he cortado los 16 bits más bajos y los paso solo.

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session session = Session.getActiveSession(); int sanitizedRequestCode = requestCode % 0x10000; session.onActivityResult(this, sanitizedRequestCode, resultCode, data); } 

    Creo que este es un error que se debe corregir en el SDK de Facebook, e insistiría en tenerlo parcheado para la próxima versión.

    Sólo se encontró con este mismo problema. La diferencia entre 64206 (0xface) y 129742 (0x1face) es porque FragmentActivity ha agregado un 0x10000 extra para determinar de qué fragmento procede. Esto se resolvió asegurándose de que la super actividad se llamó durante onActivityResult

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { // ... } } 

    Usted "Sólo puede usar 16 bits más bajos para requestCode", como se indica en FragmentActivity.startActivityFromFragment

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.