Python en Android,Charla del FUDcon Latam 2012

Post on 03-Jul-2015

3.490 views 1 download

description

Charla para el FUDcon Latam 2012 sobre como programar en Android con el lenguaje de programación Python, varios ejemplos.

Transcript of Python en Android,Charla del FUDcon Latam 2012

Python en AndroidPython en Android

Python en AndroidPython en Android

Ernesto CrespoErnesto Crespo

Email: ecrespo@gmail.comEmail: ecrespo@gmail.com

Blog:ernesto-ecrespo.blogspot.comBlog:ernesto-ecrespo.blogspot.comtwitter: @ernestocrespotwitter: @ernestocrespo

LicenciaLicencia

●Este documento está licenciado bajo la GNU Free Este documento está licenciado bajo la GNU Free

Documentation License (GFDL). www.gnu.orgDocumentation License (GFDL). www.gnu.org

●Se autoriza la copia y distribución por cualquier medio, Se autoriza la copia y distribución por cualquier medio,

siempre que se realice bajo esta misma licencia, se siempre que se realice bajo esta misma licencia, se

mencione al autor original y se incluya esta nota.mencione al autor original y se incluya esta nota.

●Es un sistema operativo basado en GNU/LinuxEs un sistema operativo basado en GNU/Linux

●Para dispositivos móviles (teléfonos inteligentesPara dispositivos móviles (teléfonos inteligentes

y tabletas)y tabletas)

●Desarrollado inicialmente por Android Inc. Desarrollado inicialmente por Android Inc.

Comprada por Google en 2005Comprada por Google en 2005

●Lo componen el sistema operativo, librerías, Lo componen el sistema operativo, librerías,

middleware y aplicacionesmiddleware y aplicaciones

●Es un sistema operativo basado en GNU/LinuxEs un sistema operativo basado en GNU/Linux

●Para dispositivos móviles (teléfonos inteligentesPara dispositivos móviles (teléfonos inteligentes

y tabletas)y tabletas)

●Desarrollado inicialmente por Android Inc. Desarrollado inicialmente por Android Inc.

Comprada por Google en 2005Comprada por Google en 2005

●Lo componen el sistema operativo, librerías, Lo componen el sistema operativo, librerías,

middleware y aplicacionesmiddleware y aplicaciones

AndroidAndroid

CaracterísticasCaracterísticas

●Máquina Virtual optimizada para dispositivos móviles DalvikMáquina Virtual optimizada para dispositivos móviles Dalvik

●Navegador integrado basado en webkitNavegador integrado basado en webkit

●Base de datos SQLiteBase de datos SQLite

●Gráficos 3D basado en OpenGLGráficos 3D basado en OpenGL

●Soporte para audio, video e imágenesSoporte para audio, video e imágenes

●Bluetooth, EDGE, 3G y wifiBluetooth, EDGE, 3G y wifi

●Camara, GPS y acelerometroCamara, GPS y acelerometro

Componentes de una aplicaciónComponentes de una aplicación

●Activities: Bloques básicos que constituyen una aplicaciónActivities: Bloques básicos que constituyen una aplicación

●Services: Procesos que corren en segundo plano, no UIServices: Procesos que corren en segundo plano, no UI

●Broadcast and Intent Receivers: Reciben y reaccionan a Broadcast and Intent Receivers: Reciben y reaccionan a

anuncios, no UIanuncios, no UI

●Content Providers: Proveen acceso a datos a otras Content Providers: Proveen acceso a datos a otras

aplicacionesaplicaciones

Arquitectura de AndroidArquitectura de Android

Características de SL4ACaracterísticas de SL4A

●Manejar intentsManejar intents

●Iniciar activitiesIniciar activities

●Realizar llamadasRealizar llamadas

●Enviar SMSEnviar SMS

●Enviar correosEnviar correos

●Escanear códigos de BarrasEscanear códigos de Barras

●Obtener localización y valores de sensoresObtener localización y valores de sensores

●Usar comunicaciones como wifi o bluetoothUsar comunicaciones como wifi o bluetooth

●Usar Text To spech (TTS)Usar Text To spech (TTS)

●Obtener información de la bateriaObtener información de la bateria

●Grabar videos y audiosGrabar videos y audios

Lenguajes interpretados soportadosLenguajes interpretados soportados

●ShellShell

●PHPPHP

●JRubyJRuby

●PerlPerl

●PythonPython

●LuaLua

●BeanShellBeanShell

●RhinoRhino

¿Cómo funciona?¿Cómo funciona?

●Cpython corre de forma nativaCpython corre de forma nativa

●Una API facade expone un subconjunto de la API de android Una API facade expone un subconjunto de la API de android

, accesible vía llamadas Json RPC, accesible vía llamadas Json RPC

●Este subconjunto es el que está disponible para el Este subconjunto es el que está disponible para el

interpreteinterprete

●La API RPC está compilada en dex bytecode, no hay La API RPC está compilada en dex bytecode, no hay

interpretación adicional en javainterpretación adicional en java

APIAPI

●ActivityResultFacadeActivityResultFacade

●AlarmManagerFacadeAlarmManagerFacade

●AndroidFacadeAndroidFacade

●ApplicationManagerFacadeApplicationManagerFacade

●BatteryManagerFacadeBatteryManagerFacade

●BluetoothFacadeBluetoothFacade

●CameraFacadeCameraFacade

●PulseGeneratorFacadePulseGeneratorFacade

●SmsFacadeSmsFacade

●WifiFacadeWifiFacade

●etcetc

APIAPI

●La API provista por SL4A es la misma para los lenguajes La API provista por SL4A es la misma para los lenguajes

soportados.soportados.

●Las llamadas del API devuelve un objeto con 3 campos:Las llamadas del API devuelve un objeto con 3 campos:

● id:Valor numérico asociado con la llamada.id:Valor numérico asociado con la llamada.

● result: valor que devuelve el API o null si no devuelve.result: valor que devuelve el API o null si no devuelve.

● error: Descripción del error, null si no hubo.error: Descripción del error, null si no hubo.

Java vs Python en AndroidJava vs Python en Android

Código de Java: Java vs Python en Código de Java: Java vs Python en AndroidAndroid

Código de python: Java vs Python Código de python: Java vs Python en Androiden Android

Programa en Java: 35 Líneas de códigoPrograma en Python: 4 Líneas de código

Instalación de SL4AInstalación de SL4A

●Instalación en el CelularInstalación en el Celular

●Instalación en el emulador de Android en Linux: Para este Instalación en el emulador de Android en Linux: Para este

caso se debe tener instalado el SDK de androidcaso se debe tener instalado el SDK de android

Instalación del interprete de PythonInstalación del interprete de Python

Al darle clip al icono de SL4A aparece la una información Al darle clip al icono de SL4A aparece la una información

donde nos pide que se agreguen scripts o interpretes donde nos pide que se agreguen scripts o interpretes

presionando el botón menú como lo muestra la siguiente presionando el botón menú como lo muestra la siguiente

figura.figura.

Instalación del interprete de PythonInstalación del interprete de Python

Al darle menú aparecen varias opciones como lo son: Al darle menú aparecen varias opciones como lo son:

Agregar, Ver, Preferencias, Ayuda, Actualizar.Agregar, Ver, Preferencias, Ayuda, Actualizar.

Instalación del interprete de PythonInstalación del interprete de Python

Al darle View o Ver aparecerá un menú donde se tiene Al darle View o Ver aparecerá un menú donde se tiene

varias opciones para visualizar, en este caso se quiere varias opciones para visualizar, en este caso se quiere

visualizar interpretesvisualizar interpretes

Instalación del interprete de PythonInstalación del interprete de Python

Al darle clip a agregar aparecerá una lista de interpretes Al darle clip a agregar aparecerá una lista de interpretes

que en este caso se instalará pythonque en este caso se instalará python

Instalación del interprete de PythonInstalación del interprete de Python

Al seleccionar Python 2.6.2 se inicia el proceso de Al seleccionar Python 2.6.2 se inicia el proceso de

instalación del interprete y de algunos scriptinstalación del interprete y de algunos script

Instalación del interprete de PythonInstalación del interprete de Python

Ahora aparece Python aparte de Shell en la lista de Ahora aparece Python aparte de Shell en la lista de

interpretadoresinterpretadores

Instalación del interprete de PythonInstalación del interprete de Python

Para probar que todo está funcionando se selecciona el Para probar que todo está funcionando se selecciona el

interpretador y este se ejecutaráinterpretador y este se ejecutará

Instalación del interprete de PythonInstalación del interprete de Python

Se lista los scripts en python de ejemplo para trabajar con Se lista los scripts en python de ejemplo para trabajar con

AndroidAndroid

Ejemplos: Entrada de datosEjemplos: Entrada de datos

#!/usr/bin/env python#!/usr/bin/env pythonimport android,timeimport android,timedroid = android.Android()droid = android.Android()texto = droid.dialogGetInput("Escriba su nombre","Nombre:")texto = droid.dialogGetInput("Escriba su nombre","Nombre:")droid.makeToast('Hola %s' %texto[1])droid.makeToast('Hola %s' %texto[1])time.sleep(5)time.sleep(5)

Ejemplos: Entrada de datosEjemplos: Entrada de datos

Ejemplos: Entrada de datosEjemplos: Entrada de datos

Ejemplos: Barra de progresoEjemplos: Barra de progreso

#!/usr/bin/env python#!/usr/bin/env python import android,timeimport android,timedroid = android.Android()droid = android.Android()titulo = "Horizontal"titulo = "Horizontal"mensaje = "Este es una barra de progreso horizontal" mensaje = "Este es una barra de progreso horizontal" numero = droid.dialogGetInput("Escriba el tiempo","tiempo:") numero = droid.dialogGetInput("Escriba el tiempo","tiempo:")

droid.dialogCreateHorizontalProgress(titulo,mensaje,int(numero[1])) droid.dialogCreateHorizontalProgress(titulo,mensaje,int(numero[1])) droid.dialogShow()droid.dialogShow()for i in range(0,int(numero[1])):for i in range(0,int(numero[1])): time.sleep(0.1)time.sleep(0.1) droid.dialogSetCurrentProgress(i) droid.dialogSetCurrentProgress(i) droid.dialogDismiss()droid.dialogDismiss()

Ejemplos: Barra de progresoEjemplos: Barra de progreso

Ejemplos: Barra de progresoEjemplos: Barra de progreso

Ejemplos: Barra de spinnerEjemplos: Barra de spinner#!/usr/bin/env python#!/usr/bin/env pythonimport android, timeimport android, timedroid = android.Android()droid = android.Android()title = 'Spinner'title = 'Spinner'message = 'Este es un simple progreso spinner.'message = 'Este es un simple progreso spinner.'numero = droid.dialogGetInput("Escriba el tiempo","tiempo:")numero = droid.dialogGetInput("Escriba el tiempo","tiempo:")droid.dialogCreateSpinnerProgress(title, message)droid.dialogCreateSpinnerProgress(title, message)droid.dialogShow()droid.dialogShow()time.sleep(int(numero[1]))time.sleep(int(numero[1]))droid.dialogDismiss()droid.dialogDismiss()

Ejemplos: Barra de spinnerEjemplos: Barra de spinner

Ejemplos: Barra de spinnerEjemplos: Barra de spinner

Ejemplos: NotificaciónEjemplos: Notificación#importar módulos android y time#importar módulos android y timeimport android,timeimport android,time #Crear la instancia de la clase Android#Crear la instancia de la clase Androiddroid = android.Android()droid = android.Android() #Se crea el mensaje de notificación.#Se crea el mensaje de notificación.droid.notify('Prueba' , 'Hola Mundo!')droid.notify('Prueba' , 'Hola Mundo!')

Ejemplos: NotificaciónEjemplos: Notificación

Ejemplos: BotónEjemplos: Botón#!/usr/bin/env python#!/usr/bin/env pythonimport android,timeimport android,timedroid = android.Android()droid = android.Android()title = 'Interfaz de usuario'title = 'Interfaz de usuario'message = 'Esta es una prueba'message = 'Esta es una prueba'droid.dialogCreateAlert(title, message)droid.dialogCreateAlert(title, message)droid.dialogSetPositiveButtonText('Continuar')droid.dialogSetPositiveButtonText('Continuar')droid.dialogShow()droid.dialogShow()response = droid.dialogGetResponse()response = droid.dialogGetResponse()droid.makeToast('El resultado de la ejecucion del boton es: %s' droid.makeToast('El resultado de la ejecucion del boton es: %s' %response[1]['which'])%response[1]['which'])time.sleep(5)time.sleep(5)

Ejemplos: BotónEjemplos: Botón

Ejemplos: BotónEjemplos: Botón

Ejemplos: BotonesEjemplos: Botones#!/usr/bin/env python#!/usr/bin/env pythonimport androidimport androiddroid = android.Android()droid = android.Android()title = 'Alerta'title = 'Alerta'message = ('Esta alerta tiene 3 botones y' 'se espera que presione message = ('Esta alerta tiene 3 botones y' 'se espera que presione uno')uno')droid.dialogCreateAlert(title, message)droid.dialogCreateAlert(title, message)droid.dialogSetPositiveButtonText('Si')droid.dialogSetPositiveButtonText('Si')droid.dialogSetNegativeButtonText('No')droid.dialogSetNegativeButtonText('No')droid.dialogSetNeutralButtonText('Cancelar')droid.dialogSetNeutralButtonText('Cancelar')droid.dialogShow()droid.dialogShow()response = droid.dialogGetResponse()response = droid.dialogGetResponse()droid.makeToast('El resultado de la ejecucion del boton es: %s' droid.makeToast('El resultado de la ejecucion del boton es: %s' %response[1]['which'])%response[1]['which'])

Ejemplos: BotonesEjemplos: Botones

Ejemplos: BotonesEjemplos: Botones

Ejemplos: BotonesEjemplos: Botones

Ejemplos: BotonesEjemplos: Botones

Ejemplos: Selección simpleEjemplos: Selección simple#!/usr/bin/env python#!/usr/bin/env pythonimport android,timeimport android,timedroid = android.Android()droid = android.Android()titulo = 'Color seleccionado'titulo = 'Color seleccionado'droid.dialogCreateAlert(titulo)droid.dialogCreateAlert(titulo)colores = ('amarillo', 'azul', 'rojo')colores = ('amarillo', 'azul', 'rojo')droid.dialogSetItems(colores)droid.dialogSetItems(colores)droid.dialogShow()droid.dialogShow()respuesta = droid.dialogGetResponse().resultrespuesta = droid.dialogGetResponse().resultdroid.makeToast('El color seleccionado es: %s' droid.makeToast('El color seleccionado es: %s' %colores[respuesta['item']])%colores[respuesta['item']])time.sleep(5)time.sleep(5)

Ejemplos: Selección simpleEjemplos: Selección simple

Ejemplos: Selección SimpleEjemplos: Selección Simple

Ejemplos: Selección Simple 2Ejemplos: Selección Simple 2#!/usr/bin/env python#!/usr/bin/env python

import android, timeimport android, timedroid = android.Android()droid = android.Android()titulo = "Seleccione una ciudad"titulo = "Seleccione una ciudad"ciudades = ['Valencia','Barquisimeto','Merida','Caracas']ciudades = ['Valencia','Barquisimeto','Merida','Caracas']droid.dialogCreateAlert(titulo)droid.dialogCreateAlert(titulo)droid.dialogSetSingleChoiceItems(ciudades)droid.dialogSetSingleChoiceItems(ciudades)droid.dialogSetPositiveButtonText('Seleccione')droid.dialogSetPositiveButtonText('Seleccione')droid.dialogSetNegativeButtonText('Salir')droid.dialogSetNegativeButtonText('Salir')droid.dialogShow()droid.dialogShow()respuesta = droid.dialogGetResponse().resultrespuesta = droid.dialogGetResponse().resultitems = droid.dialogGetSelectedItems()items = droid.dialogGetSelectedItems()if respuesta['which'] == "positive":if respuesta['which'] == "positive": droid.makeToast("La ciudad seleccionada es: %s " droid.makeToast("La ciudad seleccionada es: %s " %ciudades[int(items[1][0])])%ciudades[int(items[1][0])]) time.sleep(2)time.sleep(2)else:else: droid.makeToast("Saliendo del programa")droid.makeToast("Saliendo del programa") time.sleep(2)time.sleep(2)

Ejemplos: Selección Simple 2Ejemplos: Selección Simple 2

Ejemplos: Selección MultipleEjemplos: Selección Multiple#!/usr/bin/env python#!/usr/bin/env pythonimport android, timeimport android, timedroid = android.Android()droid = android.Android()titulo = "Seleccione las ciudades de su preferencia"titulo = "Seleccione las ciudades de su preferencia"ciudades = ['Valencia','Barquisimeto','Merida','Caracas','Maracaibo','Maracay','Margarita']ciudades = ['Valencia','Barquisimeto','Merida','Caracas','Maracaibo','Maracay','Margarita']droid.dialogCreateAlert(titulo)droid.dialogCreateAlert(titulo)droid.dialogSetMultiChoiceItems(ciudades)droid.dialogSetMultiChoiceItems(ciudades)droid.dialogSetPositiveButtonText('Seleccionar')droid.dialogSetPositiveButtonText('Seleccionar')droid.dialogSetNegativeButtonText('Salir')droid.dialogSetNegativeButtonText('Salir')droid.dialogShow()droid.dialogShow()respuesta = droid.dialogGetResponse().resultrespuesta = droid.dialogGetResponse().resultitems = droid.dialogGetSelectedItems()items = droid.dialogGetSelectedItems()if respuesta['which'] == "positive":if respuesta['which'] == "positive": if len(items[1]) == 0:if len(items[1]) == 0: droid.dialogCreateAlert("No se selecciono ciudad alguna")droid.dialogCreateAlert("No se selecciono ciudad alguna") elif len(items[1]) > 0:elif len(items[1]) > 0: lista = []lista = [] texto = ""texto = "" cantidad = len(items[1])cantidad = len(items[1]) c = 1c = 1 for i in items[1]:for i in items[1]: lista.append(ciudades[int(i)])lista.append(ciudades[int(i)]) if c <> cantidad:if c <> cantidad: texto = texto + ciudades[int(i)] + ","texto = texto + ciudades[int(i)] + "," else:else: texto = texto + ciudades[int(i)]texto = texto + ciudades[int(i)] c = c+1c = c+1 droid.dialogCreateAlert("Ciudades seleccionada: %s" %texto)droid.dialogCreateAlert("Ciudades seleccionada: %s" %texto)else:else: droid.dialogCreateAlert("Saliendo de la aplicacion")droid.dialogCreateAlert("Saliendo de la aplicacion")droid.dialogSetPositiveButtonText('Aceptar')droid.dialogSetPositiveButtonText('Aceptar')droid.dialogShow()droid.dialogShow()

Ejemplos: Selección MultipleEjemplos: Selección Multiple

Ejemplos: Selección MultipleEjemplos: Selección Multiple

Ejemplos: WebviewEjemplos: Webview<html><html> <head><head> <title>Text to Speech</title><title>Text to Speech</title> <script><script> var droid = new Android();var droid = new Android(); var speak = function() {var speak = function() { droid.postEvent("say", document.getElementById("say").value); }droid.postEvent("say", document.getElementById("say").value); } </script></script> </head></head> <body><body> <form onsubmit="speak(); return false;"><form onsubmit="speak(); return false;"> <label for="say">que le gustaria decir?</label><label for="say">que le gustaria decir?</label> <input type="text" id="say" /><input type="text" id="say" /> <input type="submit" value="Speak" /><input type="submit" value="Speak" /> </form></form> </body></body></html></html>

Ejemplos: WebviewEjemplos: Webviewimport androidimport android

droid = android.Android()droid = android.Android()droid.webViewShow('file:///sdcard/sl4a/scripts/text_to_speech2.html')droid.webViewShow('file:///sdcard/sl4a/scripts/text_to_speech2.html')while True:while True: result = droid.waitForEvent('say').resultresult = droid.waitForEvent('say').result droid.ttsSpeak(result['data'])droid.ttsSpeak(result['data'])

Ejemplos: WebviewEjemplos: Webview

Ejemplos: WebviewEjemplos: Webview

Más ejemplosMás ejemplosEjecución remota de programas python en el celular:Ejecución remota de programas python en el celular:●Posición del celular en google mapPosición del celular en google maphttp://ernesto-ecrespo.blogspot.com/2011/01/aplicacion-que-muestra-las-coordenadas.htmlhttp://ernesto-ecrespo.blogspot.com/2011/01/aplicacion-que-muestra-las-coordenadas.html

●Captura de la información de la posición del celular desde LinuxCaptura de la información de la posición del celular desde Linuxhttp://ernesto-ecrespo.blogspot.com/2010/12/capturar-la-ubicacion-del-celular.htmlhttp://ernesto-ecrespo.blogspot.com/2010/12/capturar-la-ubicacion-del-celular.html

●Obtener información del estado de la bateriaObtener información del estado de la bateriahttp://ernesto-ecrespo.blogspot.com/2010/12/obtener-informacion-del-estado-de-la.htmlhttp://ernesto-ecrespo.blogspot.com/2010/12/obtener-informacion-del-estado-de-la.html

●Manejar los mensajes de texto desde LinuxManejar los mensajes de texto desde Linuxhttp://ernesto-ecrespo.blogspot.com/2010/12/manejar-los-mensajes-de-texto-del.htmlhttp://ernesto-ecrespo.blogspot.com/2010/12/manejar-los-mensajes-de-texto-del.html

●Enviar mensajes de texto desde android con pythonEnviar mensajes de texto desde android con pythonhttp://ernesto-ecrespo.blogspot.com/2010/06/enviar-mensajes-de-texto-desde-android.htmlhttp://ernesto-ecrespo.blogspot.com/2010/06/enviar-mensajes-de-texto-desde-android.html

●Enviar correo electrónico desde andoird con pythonEnviar correo electrónico desde andoird con pythonhttp://ernesto-ecrespo.blogspot.com/2010/06/enviar-correo-desde-android-con-python.htmlhttp://ernesto-ecrespo.blogspot.com/2010/06/enviar-correo-desde-android-con-python.html

●Más ejemplos en la página oficialMás ejemplos en la página oficial●http://code.google.com/p/android-scripting/wiki/Tutorialshttp://code.google.com/p/android-scripting/wiki/Tutorials

Usos de SL4AUsos de SL4ASmallSatSmallSat

Usos de SL4AUsos de SL4ACellbotsCellbots

Referencias:Referencias:●WikipediaWikipediahttp://es.wikipedia.org/wiki/Androidhttp://es.wikipedia.org/wiki/Android

●Sitio oficial de AndroidSitio oficial de Androidhttp://developer.android.com/guide/basics/what-is-android.htmlhttp://developer.android.com/guide/basics/what-is-android.html

●Sitio Oficial de SL4ASitio Oficial de SL4Ahttp://code.google.com/p/android-scripting/http://code.google.com/p/android-scripting/

●Presentación Programando en Android de Matias Bordese en PyArPresentación Programando en Android de Matias Bordese en PyArhttp://python.org.ar/pyar/Charlas#Programando_Python_en_Androidhttp://python.org.ar/pyar/Charlas#Programando_Python_en_Android

●Blog de Ernesto CrespoBlog de Ernesto Crespohttp://ernesto-ecrespo.blogspot.com/search/label/Androidhttp://ernesto-ecrespo.blogspot.com/search/label/Android

●Cellbots, Canal de youtube:Cellbots, Canal de youtube:http://www.youtube.com/cellbotshttp://www.youtube.com/cellbots

●SmallSatSmallSathttp://blog.makezine.com/2010/07/27/nexus-onearduino-smallsat-satellite/http://blog.makezine.com/2010/07/27/nexus-onearduino-smallsat-satellite/

●CellbotsCellbotswww.cellbots.comwww.cellbots.com

●Cellbot control:Cellbot control:https://github.com/georgegoh/cellbot-controllerhttps://github.com/georgegoh/cellbot-controller