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:
- Actualizado - Android Facebook api 3.0 error: No se puede llamar a LoginActivity con un paquete de llamada nula
- LoginButton con Fragmento nativo
- Facebook anuncios nativos en reciclar view android
- Facebook Login No Regresar Usuario access_token
- Cómo habilitar las pestañas personalizadas de Chrome para iniciar sesión en Facebook con Android SDK
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.
- Android Facebook SDK 3.0 Estado de sesión "Apertura"
- Facebook SDK 3 EOFException
- Pocas pérdidas de memoria en Facebook SDK
- ¿Cómo detectar un evento de cierre de sesión con la API de Android de Facebook v4?
- Facebook Android API y Twitter Webview Login integración
- Cómo enviar aplicaciones fb app como Kiwi App
- "No pudo encontrar el error com_facebook_android.apk" al ejecutar el proyecto de Android
- Actividad de Facebook no se carga correctamente en facebook-sdk 4.4.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
- Programación de Android – Hacer un URI para obtener la ubicación de audio
- ¿Por qué android.app.Activity no es abstracto por diseño?