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:
- "No pudo encontrar el error com_facebook_android.apk" al ejecutar el proyecto de Android
- Frictionless compartir facebook en Android
- Moviendo la carpeta de instalación de SDK de Android
- Publicar una foto de un ShareDialog nativo en Facebook android SDK
- Sube una foto a Facebook con Facebook Android SDK en Android
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.
- Facebook Android SDK 3.0 siempre devuelve ABRIR al iniciar sesión
- Facebook - Publicar en pared desde la aplicación de Android
- Android - Facebook SDK login -> cerrar sesión -> inicio de sesión no funciona
- No se pudo encontrar Facebook SDK.apk
- ¿Deben las aplicaciones de Android con un componente de servidor acceder directamente a Facebook?
- Session: se ha intentado solicitar nuevos permisos para una sesión que tiene una petición pendiente
- FbDialog no muestra contenido completo en dispositivos más pequeños
- El contenido de Dialog de Android Facebook Share no se muestra en la página principal
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?