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.

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

  • Iniciar sesión en facebook desde mi aplicación funciona en el emulador pero no en el dispositivo
  • La clave de la aplicación de Android no coincide con ninguna hash de clave almacenada
  • Configuración de sesión de Android FB API 3.0 con fragmentos
  • ¿Estaría bloqueando Facebook Androoid SDK mi apps en el nivel de api por debajo de 15?
  • Generación de hash de claves de liberación en Linux OS (Ubuntu): Android Facebook SDK
  • No se puede ejecutar con SDK de Facebook incluido
  • ¿Cómo obtener el token de acceso actual en Facebook Android SDK V4?
  • Refrescar los permisos de token en Facebook Android SDK
  • Identificar el botón de inicio de sesión de Facebook SDK 3 en el clic
  • Cómo cargar dinámicamente R.styleable recurso?
  • android - cómo cambiar el texto en facebook botón de 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.