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

  • Recursos $ NotFoundException se lanza integrando Facebook-android-sdk-3.0
  • "No se puede resolver el símbolo` Request` 'error para facebook Graph API
  • Facebook android sdk v4 inicio de sesión cancelar
  • La aplicación se bloquea después del primer inicio de sesión en Facebook
  • Android SDK de Facebook v3.0 SSO LoginButton devolver un nulo GraphUser
  • Cómo resolver las herramientas de Facebook: replace = "android: theme"?
  • ¿Qué tan seguro acceder a mi aplicación de Android con facebook-id?
  • Session.openActiveSession sólo llama OPENING en Facebook SDK de Android
  • Creación de Android Gradle con subproyectos
  • Aplicación para Android de Facebook: expiración de token de acceso (expires_in) siempre es 0
  • Cómo almacenar usuario conectado en el estado de facebook sdk 4.4.0 android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.