Usar Facebook-SDK cón Python-for-Android / Kivy

kivy-logo-black-512 Para un nuevo proyecto interactivo con un museo, Arnaud de devosite me pidió de mirar si se podía integrar con Facebook en una Aplicación para Android. La librería habitual en python esta pensada para aplicaciones Desktop, y abre manualmente una ventana del navegador web para capturar la autorización del usuario. Pero esto no es realmente lo que queremos, seria mejor remplazarlo por una integración 100% nativa.

Los pre requisitos:
– Kivy ( Python-for-Android )
En este Blog pueden encontrar el tutorial para instalar Py4a
– Una cuenta en Facebook ( obviamente )
Facebook SDK 3.0

El código fuente:
Se puede clonar el repositorio del ejemplo en github:

$ git clone https://github.com/tito/p4a-facebook-example

Registrar una aplicación en Facebook:

  1. Ir a la página de Facebook para desarrolladores
  2. Hacen Click en “Create new App”
  3. Llenar la información “App Name”. no poner “FB” o “Facebook” en el titulo, o sino su aplicación se considerada inválida.:D
  4. Sélection_108

  5. Pasar el Captcha
  6. Guardar el id de su aplicación en algun lado.
  7. Ahora, necesitan activar la aplicación Nativa para Android. Es importante que el nombre de su package debe ser el mismo que el que escriben en la opción de compilación –package esto es cuando se ejecuta el build del APK. El nombre de la Clase es un nombre de package: package/Activity es siempre lo mismo para todas las aplicaciones compiladas con Python-For-Android.
  8. Sélection_109

  9. Ahora, el SDK de Facebook para Android no va a autorizar nuestra aplicacion android, porque facebbok quiere saber la firma de tipo hash que va ser utilizada en nuestro APK. Para generar este Hash, van a necesitar usar el Keytool. Aqui un ejemplo para generar una simple clave debug:
    $ keytool -exportcert -alias androiddebugkey \
       -keystore ~/.android/debug.keystore | \
       openssl sha1 -binary | openssl base64
    Enter keystore password:  android
    u+bzQmG87L298C4KGM8yODi3W/4=

    Copien esta clave generada, y la pegan en este campo:

  10. Sélection_110

Configuración Set up de nuestra aplicación:

  1. Ir a nuestro proyecto p4a-facebook-example, y editan el main.py
  2. Buscar FACEBOOK_APP_ID, y remplazen por nuestra propio ID de Aplicación.
  3. Ir a python-for-android, y crear una distribución:
    $ ./distribute.sh -m 'kivy'
  4. Ir a dist/default
  5. Generar nuestro APK una vez ( para generar todo el archivo necesitamos customizar ). Remplazen /path/to/p4a-facebook-example:
    ./build.py --name "Facebook test" --package org.test.facebook \
      --version 1 --private /path/to/p4a-facebook-example/ \
      --window --permission INTERNET debug
  6. Agregar una nueva referencia a project.properties para incluir el SDK de Facebook. El path a Facebook SDK debe ser un path relativo, sino tendran problemas para correr el siguiente build:
    android.library.reference.1=../../facebook-android-sdk-3.0.2/facebook
  7. Editar el manifiesto en: templates/AndroidManifest.xml para incluir el Activity de nuestro Login de facebook, justo despues de < application >
    <application android:label="@string/appName" android:icon="@drawable/icon">
    <activity android:name="com.facebook.LoginActivity"/>
  8. Volver a lanzar la compilacion del APK… y estamos listo para probar :D
  9. Instalar la aplicación en su dispositivo desde este comando:
    $ adb install -r bin/Facebooktest-1-debug.apk

Prueban su aplicación:

El SDK de Facebook 3.0 requiere separar permisos de lectura y escritura. Esto significa que a su usuario tienen que aceptar dos veces los diálogos de la pagina de facebook. Si quieren publicar en el stream de la aplicación, necesita tener un permiso básico ( Lectura ) aceptado por el usuario antes de publicar los permisos. Esto esta ya implementado en la aplicación de ejemplo.

Cuando inician la aplicación por la primera vez, van a tener:
device-2013-08-08-110647-1024x640

Dependiendo si se trata de una aplicación nativa o no, tendrán 2 tipos de cajas para la autentificación.

Sin la app de facebook instalada en el dispositivo:
device-2013-08-08-110834

Y con la app de facebook instalada en el dispositivo:
device-2013-08-08-111002

Después de la autentificacion, el usuario va a necesitar nuestros permisos:
device-2013-08-08-111111

Hecho !

Ahora la aplicación cuenta con los permisos para crear un Post ! El Post de ejemplo en el stream del usuario es la aplicación ella misma, y no el usuario. Se llama “publish_actions”.

Mas lejo:

Obviamente, cuando están desarrollando con el SDK de Facebook, se siente un dolor ajeno por el diseño mismo de la API, que fue diseñado para Java. Cada Callback que facebook quiera llamar, se necesita implementar una clase de Java, y definir un metodo callback. Python es realmente de una filosofía simple y lo hace mucho mas divertido para usar.

Vean ustedes mismo: hagamos un llamado a Request.newStatusUpdaterequest. Necesitamos implementar una clase GraphUserCallBack en Java. Gracias a Pyjnius, lo hacemos directamente desde Python.

class _FacebookGraphUserCallback(PythonJavaClass):
 
    __javainterfaces__ = ['com.facebook.Request$GraphUserCallback']
    __javacontext__ = 'app'
 
    def __init__(self, callback):
        self.callback = callback
        super(_FacebookGraphUserCallback, self).__init__()
 
    @java_method('(Lcom/facebook/model/GraphUser;Lcom/facebook/Response;)V')
    def onCompleted(self, user, response):
        self.callback(user, response)

La clase de Python/Java va a llamar nuestro propio python callback cuando el Callback de Java onCompleted va a ser llamado. Luego:

  @run_on_ui_thread
    def post(self, text, callback):
        req = Request.newStatusUpdateRequest(
                self._session, text, _FacebookRequestCallback(callback))
        req.executeAsync()

Todo lo que hay que hacer al final es poner el metodo post:

def fb_post(self, text):
        def callback(*args):
            from time import time
            self.post_status = 'message posted at {}'.format(time())
        self.facebook.post(text, callback=callback)

No estoy proviendo un wrapper para todos los llamados posibles que se puedan hacer con facebook. Solo tengo este ejemplo de “post” y “me”. Ambos wrapper Request.newStatusUpdaterequest y Request.newMeRequest.

Noten que a cada una de estas peticiones deben occurrir en el UI thread.

Para esto recomiendo usar el modulo de python-for-android/runnable, con el decorator @run_on_ui_thread.

El final

No era muy fácil encontrar la solución, y es siempre complejo poner todas las piezas juntas. He probado de usar nuestro propio LoginButton ( porque el cliente me decían como lo querían ), Pero no fue posible usarlo en nuestra aplicación. Más que nada porque el LoginButton es un puro Android Widget, y por la simple razón que no querríamos devolvernos al Activity después del Login. Estuve bloqueado mucho tiempo con esto.

Noten que no pueden compartir la aplicacion con un Fake facebook button, el diseño y look-and-feel tienen que ser el mismo que el original.

Espero que esto le vienen de gran ayuda para empezar!

Post original en ingles escrito por Mathieu Virbel: http://txzone.net/2013/08/using-facebook-sdk-with-python-for-android-kivy/

Mathieu Virbel
Mathieu Virbel es un activo desarrollador de código libre y abierto, apasionado de la música y de los artes, usando las nuevas tecnologías y las soluciones táctiles. Desde el 2007, ha hecho el salto en las tecnologías para las aplicaciones multi táctiles y en el 2008 se unió al proyecto PyMT/Kivy. Esta liderando multiples proyectos con el Framework Kivy, Python-for-android (P4a), Pyjnius o hasta Movid, un tracker de blog en c++/html5.
Mathieu Virbel
Mathieu Virbel

Latest posts by Mathieu Virbel (see all)

About Mathieu Virbel

Mathieu Virbel es un activo desarrollador de código libre y abierto, apasionado de la música y de los artes, usando las nuevas tecnologías y las soluciones táctiles. Desde el 2007, ha hecho el salto en las tecnologías para las aplicaciones multi táctiles y en el 2008 se unió al proyecto PyMT/Kivy. Esta liderando multiples proyectos con el Framework Kivy, Python-for-android (P4a), Pyjnius o hasta Movid, un tracker de blog en c++/html5.
This entry was posted in kivy, Python4Android. Bookmark the permalink.

Una Respuesta a “Usar Facebook-SDK cón Python-for-Android / Kivy”

  1. carlos c dice:

    hola, genial tu pagina, me gustaria pedirte un favor y es que estoy trabajando con sla4 y python y resulta que al ejecutar un simple script para abrir google maps, simplemente todo queda en blanco y al final sale null, buscando se habla de un manifiesto de permisos, pero nadie dice donde se pone como se usa en el script, me gustaria si puedes y quieres me aclares esto por que la verdad todo esta muy vago, gracias

Deja un comentario

  • Facebook AndroidCol