Python en Android
Python en Android




   Ernesto Crespo
   Email: ecrespo@gmail.com
   Blog:ernesto-ecrespo.blogspot.com
   twitter: @ernestocrespo
Licencia
●   Este documento está licenciado bajo la GNU Free
Documentation License (GFDL). www.gnu.org
●   Se autoriza la copia y distribución por cualquier medio,
siempre que se realice bajo esta misma licencia, se
mencione al autor original y se incluya esta nota.
Android

●Es un sistema operativo basado en GNU/Linux
 ●Es un sistema operativo basado en GNU/Linux
●Para dispositivos móviles (teléfonos inteligentes
 ●Para dispositivos móviles (teléfonos inteligentes


  y tabletas)
   y tabletas)
●Desarrollado inicialmente por Android Inc.
 ●Desarrollado inicialmente por Android Inc.


 Comprada por Google en 2005
  Comprada por Google en 2005
●Lo componen el sistema operativo, librerías,
 ●Lo componen el sistema operativo, librerías,


 middleware y aplicaciones
 middleware y aplicaciones
Características
●   Máquina Virtual optimizada para dispositivos móviles Dalvik
●   Navegador integrado basado en webkit
●   Base de datos SQLite
●   Gráficos 3D basado en OpenGL
●   Soporte para audio, video e imágenes
●   Bluetooth, EDGE, 3G y wifi
●   Camara, GPS y acelerometro
Componentes de una aplicación
●   Activities: Bloques básicos que constituyen una aplicación
●   Services: Procesos que corren en segundo plano, no UI
●   Broadcast and Intent Receivers: Reciben y reaccionan a
anuncios, no UI
●   Content Providers: Proveen acceso a datos a otras
aplicaciones
Arquitectura de Android
Características de SL4A
●   Manejar intents
●   Iniciar activities
●   Realizar llamadas
●   Enviar SMS
●   Enviar correos
●   Escanear códigos de Barras
●   Obtener localización y valores de sensores
●   Usar comunicaciones como wifi o bluetooth
●   Usar Text To spech (TTS)
●   Obtener información de la bateria
●   Grabar videos y audios
Lenguajes interpretados soportados
●   Shell
●   PHP
●   JRuby
●   Perl
●   Python
●   Lua
●   BeanShell
●   Rhino
¿Cómo funciona?
●   Cpython corre de forma nativa
●   Una API facade expone un subconjunto de la API de android
, accesible vía llamadas Json RPC
●   Este subconjunto es el que está disponible para el
interprete
●   La API RPC está compilada en dex bytecode, no hay
interpretación adicional en java
API
●   ActivityResultFacade
●   AlarmManagerFacade
●   AndroidFacade
●   ApplicationManagerFacade
●   BatteryManagerFacade
●   BluetoothFacade
●   CameraFacade
●   PulseGeneratorFacade
●   SmsFacade
●   WifiFacade
●   etc
API
●   La API provista por SL4A es la misma para los lenguajes
soportados.
●   Las llamadas del API devuelve un objeto con 3 campos:
    ●   id:Valor numérico asociado con la llamada.
    ●   result: valor que devuelve el API o null si no devuelve.
    ●   error: Descripción del error, null si no hubo.
Java vs Python en Android
Código de Java: Java vs Python en
Android
Código de python: Java vs Python
en Android




Programa en Java: 35 Líneas de código
Programa en Python: 4 Líneas de código
Instalación de SL4A
●   Instalación en el Celular
●   Instalación en el emulador de Android en Linux: Para este
caso se debe tener instalado el SDK de android
Instalación del interprete de Python
Al darle clip al icono de SL4A aparece la una información
donde nos pide que se agreguen scripts o interpretes
presionando el botón menú como lo muestra la siguiente
figura.
Instalación del interprete de Python
Al darle menú aparecen varias opciones como lo son:
Agregar, Ver, Preferencias, Ayuda, Actualizar.
Instalación del interprete de Python
Al darle View o Ver aparecerá un menú donde se tiene
varias opciones para visualizar, en este caso se quiere
visualizar interpretes
Instalación del interprete de Python
Al darle clip a agregar aparecerá una lista de interpretes
que en este caso se instalará python
Instalación del interprete de Python
Al seleccionar Python 2.6.2 se inicia el proceso de
instalación del interprete y de algunos script
Instalación del interprete de Python
Ahora aparece Python aparte de Shell en la lista de
interpretadores
Instalación del interprete de Python
Para probar que todo está funcionando se selecciona el
interpretador y este se ejecutará
Instalación del interprete de Python
Se lista los scripts en python de ejemplo para trabajar con
Android
Ejemplos: Entrada de datos
#!/usr/bin/env python
import android,time
droid = android.Android()
texto = droid.dialogGetInput("Escriba su nombre","Nombre:")
droid.makeToast('Hola %s' %texto[1])
time.sleep(5)
Ejemplos: Entrada de datos
Ejemplos: Entrada de datos
Ejemplos: Barra de progreso
#!/usr/bin/env python

import android,time
droid = android.Android()
titulo = "Horizontal"
mensaje = "Este es una barra de progreso horizontal"
numero = droid.dialogGetInput("Escriba el tiempo","tiempo:")

droid.dialogCreateHorizontalProgress(titulo,mensaje,int(numero[1]))
droid.dialogShow()
for i in range(0,int(numero[1])):
  time.sleep(0.1)
  droid.dialogSetCurrentProgress(i)
droid.dialogDismiss()
Ejemplos: Barra de progreso
Ejemplos: Barra de progreso
Ejemplos: Barra de spinner
#!/usr/bin/env python
import android, time
droid = android.Android()
title = 'Spinner'
message = 'Este es un simple progreso spinner.'
numero = droid.dialogGetInput("Escriba el tiempo","tiempo:")
droid.dialogCreateSpinnerProgress(title, message)
droid.dialogShow()
time.sleep(int(numero[1]))
droid.dialogDismiss()
Ejemplos: Barra de spinner
Ejemplos: Barra de spinner
Ejemplos: Notificación
#importar módulos android y time
import android,time

#Crear la instancia de la clase Android
droid = android.Android()

#Se crea el mensaje de notificación.
droid.notify('Prueba' , 'Hola Mundo!')
Ejemplos: Notificación
Ejemplos: Botón
#!/usr/bin/env python
import android,time
droid = android.Android()
title = 'Interfaz de usuario'
message = 'Esta es una prueba'
droid.dialogCreateAlert(title, message)
droid.dialogSetPositiveButtonText('Continuar')
droid.dialogShow()
response = droid.dialogGetResponse()
droid.makeToast('El resultado de la ejecucion del boton es: %s'
%response[1]['which'])
time.sleep(5)
Ejemplos: Botón
Ejemplos: Botón
Ejemplos: Botones
#!/usr/bin/env python
import android
droid = android.Android()
title = 'Alerta'
message = ('Esta alerta tiene 3 botones y' 'se espera que presione
uno')
droid.dialogCreateAlert(title, message)
droid.dialogSetPositiveButtonText('Si')
droid.dialogSetNegativeButtonText('No')
droid.dialogSetNeutralButtonText('Cancelar')
droid.dialogShow()
response = droid.dialogGetResponse()
droid.makeToast('El resultado de la ejecucion del boton es: %s'
%response[1]['which'])
Ejemplos: Botones
Ejemplos: Botones
Ejemplos: Botones
Ejemplos: Botones
Ejemplos: Selección simple
#!/usr/bin/env python
import android,time
droid = android.Android()
titulo = 'Color seleccionado'
droid.dialogCreateAlert(titulo)
colores = ('amarillo', 'azul', 'rojo')
droid.dialogSetItems(colores)
droid.dialogShow()
respuesta = droid.dialogGetResponse().result
droid.makeToast('El color seleccionado es: %s'
%colores[respuesta['item']])
time.sleep(5)
Ejemplos: Selección simple
Ejemplos: Selección Simple
Ejemplos: Selección Simple 2
#!/usr/bin/env python

import android, time
droid = android.Android()
titulo = "Seleccione una ciudad"
ciudades = ['Valencia','Barquisimeto','Merida','Caracas']
droid.dialogCreateAlert(titulo)
droid.dialogSetSingleChoiceItems(ciudades)
droid.dialogSetPositiveButtonText('Seleccione')
droid.dialogSetNegativeButtonText('Salir')
droid.dialogShow()
respuesta = droid.dialogGetResponse().result
items = droid.dialogGetSelectedItems()
if respuesta['which'] == "positive":
   droid.makeToast("La ciudad seleccionada es: %s "
%ciudades[int(items[1][0])])
   time.sleep(2)
else:
   droid.makeToast("Saliendo del programa")
   time.sleep(2)
Ejemplos: Selección Simple 2
Ejemplos: Selección Multiple
#!/usr/bin/env python
import android, time
droid = android.Android()
titulo = "Seleccione las ciudades de su preferencia"
ciudades = ['Valencia','Barquisimeto','Merida','Caracas','Maracaibo','Maracay','Margarita']
droid.dialogCreateAlert(titulo)
droid.dialogSetMultiChoiceItems(ciudades)
droid.dialogSetPositiveButtonText('Seleccionar')
droid.dialogSetNegativeButtonText('Salir')
droid.dialogShow()
respuesta = droid.dialogGetResponse().result
items = droid.dialogGetSelectedItems()
if respuesta['which'] == "positive":
   if len(items[1]) == 0:
       droid.dialogCreateAlert("No se selecciono ciudad alguna")
   elif len(items[1]) > 0:
       lista = []
       texto = ""
       cantidad = len(items[1])
       c=1
       for i in items[1]:
          lista.append(ciudades[int(i)])
          if c <> cantidad:
             texto = texto + ciudades[int(i)] + ","
          else:
             texto = texto + ciudades[int(i)]
          c = c+1
       droid.dialogCreateAlert("Ciudades seleccionada: %s" %texto)
else:
   droid.dialogCreateAlert("Saliendo de la aplicacion")
droid.dialogSetPositiveButtonText('Aceptar')
droid.dialogShow()
Ejemplos: Selección Multiple
Ejemplos: Selección Multiple
Ejemplos: Webview
<html>
 <head>
  <title>Text to Speech</title>
  <script>
    var droid = new Android();
    var speak = function() {
   droid.postEvent("say", document.getElementById("say").value); }
  </script>
 </head>
 <body>
  <form onsubmit="speak(); return false;">
    <label for="say">que le gustaria decir?</label>
    <input type="text" id="say" />
    <input type="submit" value="Speak" />
  </form>
 </body>
</html>
Ejemplos: Webview
import android

droid = android.Android()
droid.webViewShow('file:///sdcard/sl4a/scripts/text_to_speech2.html')
while True:
 result = droid.waitForEvent('say').result
 droid.ttsSpeak(result['data'])
Ejemplos: Webview
Ejemplos: Webview
Más ejemplos
Ejecución remota de programas python en el celular:
●Posición del celular en google map

http://ernesto-ecrespo.blogspot.com/2011/01/aplicacion-que-muestra-las-coordenadas.html
●   Captura de la información de la posición del celular desde Linux
http://ernesto-ecrespo.blogspot.com/2010/12/capturar-la-ubicacion-del-celular.html
●   Obtener información del estado de la bateria
http://ernesto-ecrespo.blogspot.com/2010/12/obtener-informacion-del-estado-de-la.html
●   Manejar los mensajes de texto desde Linux
http://ernesto-ecrespo.blogspot.com/2010/12/manejar-los-mensajes-de-texto-del.html
●   Enviar mensajes de texto desde android con python
http://ernesto-ecrespo.blogspot.com/2010/06/enviar-mensajes-de-texto-desde-android.html
●   Enviar correo electrónico desde andoird con python
http://ernesto-ecrespo.blogspot.com/2010/06/enviar-correo-desde-android-con-python.html
●   Más ejemplos en la página oficial
http://code.google.com/p/android-scripting/wiki/Tutorials
●
Usos de SL4A
SmallSat
Usos de SL4A
Cellbots
Referencias:
Wikipedia
●


 http://es.wikipedia.org/wiki/Android
●Sitio oficial de Android

 http://developer.android.com/guide/basics/what-is-android.html
●Sitio Oficial de SL4A

 http://code.google.com/p/android-scripting/
●Presentación Programando en Android de Matias Bordese en PyAr

 http://python.org.ar/pyar/Charlas#Programando_Python_en_Android
●Blog de Ernesto Crespo

 http://ernesto-ecrespo.blogspot.com/search/label/Android
●Cellbots, Canal de youtube:

 http://www.youtube.com/cellbots
●SmallSat

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

 www.cellbots.com
●Cellbot control:

 https://github.com/georgegoh/cellbot-controller

Python en Android,Charla del FUDcon Latam 2012

  • 1.
  • 2.
    Python en Android Ernesto Crespo Email: ecrespo@gmail.com Blog:ernesto-ecrespo.blogspot.com twitter: @ernestocrespo
  • 3.
    Licencia ● Este documento está licenciado bajo la GNU Free Documentation License (GFDL). www.gnu.org ● Se autoriza la copia y distribución por cualquier medio, siempre que se realice bajo esta misma licencia, se mencione al autor original y se incluya esta nota.
  • 4.
    Android ●Es un sistemaoperativo basado en GNU/Linux ●Es un sistema operativo basado en GNU/Linux ●Para dispositivos móviles (teléfonos inteligentes ●Para dispositivos móviles (teléfonos inteligentes y tabletas) y tabletas) ●Desarrollado inicialmente por Android Inc. ●Desarrollado inicialmente por Android Inc. Comprada por Google en 2005 Comprada por Google en 2005 ●Lo componen el sistema operativo, librerías, ●Lo componen el sistema operativo, librerías, middleware y aplicaciones middleware y aplicaciones
  • 5.
    Características ● Máquina Virtual optimizada para dispositivos móviles Dalvik ● Navegador integrado basado en webkit ● Base de datos SQLite ● Gráficos 3D basado en OpenGL ● Soporte para audio, video e imágenes ● Bluetooth, EDGE, 3G y wifi ● Camara, GPS y acelerometro
  • 6.
    Componentes de unaaplicación ● Activities: Bloques básicos que constituyen una aplicación ● Services: Procesos que corren en segundo plano, no UI ● Broadcast and Intent Receivers: Reciben y reaccionan a anuncios, no UI ● Content Providers: Proveen acceso a datos a otras aplicaciones
  • 7.
  • 8.
    Características de SL4A ● Manejar intents ● Iniciar activities ● Realizar llamadas ● Enviar SMS ● Enviar correos ● Escanear códigos de Barras ● Obtener localización y valores de sensores ● Usar comunicaciones como wifi o bluetooth ● Usar Text To spech (TTS) ● Obtener información de la bateria ● Grabar videos y audios
  • 9.
    Lenguajes interpretados soportados ● Shell ● PHP ● JRuby ● Perl ● Python ● Lua ● BeanShell ● Rhino
  • 10.
    ¿Cómo funciona? ● Cpython corre de forma nativa ● Una API facade expone un subconjunto de la API de android , accesible vía llamadas Json RPC ● Este subconjunto es el que está disponible para el interprete ● La API RPC está compilada en dex bytecode, no hay interpretación adicional en java
  • 11.
    API ● ActivityResultFacade ● AlarmManagerFacade ● AndroidFacade ● ApplicationManagerFacade ● BatteryManagerFacade ● BluetoothFacade ● CameraFacade ● PulseGeneratorFacade ● SmsFacade ● WifiFacade ● etc
  • 12.
    API ● La API provista por SL4A es la misma para los lenguajes soportados. ● Las llamadas del API devuelve un objeto con 3 campos: ● id:Valor numérico asociado con la llamada. ● result: valor que devuelve el API o null si no devuelve. ● error: Descripción del error, null si no hubo.
  • 13.
    Java vs Pythonen Android
  • 14.
    Código de Java:Java vs Python en Android
  • 15.
    Código de python:Java vs Python en Android Programa en Java: 35 Líneas de código Programa en Python: 4 Líneas de código
  • 16.
    Instalación de SL4A ● Instalación en el Celular ● Instalación en el emulador de Android en Linux: Para este caso se debe tener instalado el SDK de android
  • 17.
    Instalación del interpretede Python Al darle clip al icono de SL4A aparece la una información donde nos pide que se agreguen scripts o interpretes presionando el botón menú como lo muestra la siguiente figura.
  • 18.
    Instalación del interpretede Python Al darle menú aparecen varias opciones como lo son: Agregar, Ver, Preferencias, Ayuda, Actualizar.
  • 19.
    Instalación del interpretede Python Al darle View o Ver aparecerá un menú donde se tiene varias opciones para visualizar, en este caso se quiere visualizar interpretes
  • 20.
    Instalación del interpretede Python Al darle clip a agregar aparecerá una lista de interpretes que en este caso se instalará python
  • 21.
    Instalación del interpretede Python Al seleccionar Python 2.6.2 se inicia el proceso de instalación del interprete y de algunos script
  • 22.
    Instalación del interpretede Python Ahora aparece Python aparte de Shell en la lista de interpretadores
  • 23.
    Instalación del interpretede Python Para probar que todo está funcionando se selecciona el interpretador y este se ejecutará
  • 24.
    Instalación del interpretede Python Se lista los scripts en python de ejemplo para trabajar con Android
  • 25.
    Ejemplos: Entrada dedatos #!/usr/bin/env python import android,time droid = android.Android() texto = droid.dialogGetInput("Escriba su nombre","Nombre:") droid.makeToast('Hola %s' %texto[1]) time.sleep(5)
  • 26.
  • 27.
  • 28.
    Ejemplos: Barra deprogreso #!/usr/bin/env python import android,time droid = android.Android() titulo = "Horizontal" mensaje = "Este es una barra de progreso horizontal" numero = droid.dialogGetInput("Escriba el tiempo","tiempo:") droid.dialogCreateHorizontalProgress(titulo,mensaje,int(numero[1])) droid.dialogShow() for i in range(0,int(numero[1])): time.sleep(0.1) droid.dialogSetCurrentProgress(i) droid.dialogDismiss()
  • 29.
  • 30.
  • 31.
    Ejemplos: Barra despinner #!/usr/bin/env python import android, time droid = android.Android() title = 'Spinner' message = 'Este es un simple progreso spinner.' numero = droid.dialogGetInput("Escriba el tiempo","tiempo:") droid.dialogCreateSpinnerProgress(title, message) droid.dialogShow() time.sleep(int(numero[1])) droid.dialogDismiss()
  • 32.
  • 33.
  • 34.
    Ejemplos: Notificación #importar módulosandroid y time import android,time #Crear la instancia de la clase Android droid = android.Android() #Se crea el mensaje de notificación. droid.notify('Prueba' , 'Hola Mundo!')
  • 35.
  • 36.
    Ejemplos: Botón #!/usr/bin/env python importandroid,time droid = android.Android() title = 'Interfaz de usuario' message = 'Esta es una prueba' droid.dialogCreateAlert(title, message) droid.dialogSetPositiveButtonText('Continuar') droid.dialogShow() response = droid.dialogGetResponse() droid.makeToast('El resultado de la ejecucion del boton es: %s' %response[1]['which']) time.sleep(5)
  • 37.
  • 38.
  • 39.
    Ejemplos: Botones #!/usr/bin/env python importandroid droid = android.Android() title = 'Alerta' message = ('Esta alerta tiene 3 botones y' 'se espera que presione uno') droid.dialogCreateAlert(title, message) droid.dialogSetPositiveButtonText('Si') droid.dialogSetNegativeButtonText('No') droid.dialogSetNeutralButtonText('Cancelar') droid.dialogShow() response = droid.dialogGetResponse() droid.makeToast('El resultado de la ejecucion del boton es: %s' %response[1]['which'])
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
    Ejemplos: Selección simple #!/usr/bin/envpython import android,time droid = android.Android() titulo = 'Color seleccionado' droid.dialogCreateAlert(titulo) colores = ('amarillo', 'azul', 'rojo') droid.dialogSetItems(colores) droid.dialogShow() respuesta = droid.dialogGetResponse().result droid.makeToast('El color seleccionado es: %s' %colores[respuesta['item']]) time.sleep(5)
  • 45.
  • 46.
  • 47.
    Ejemplos: Selección Simple2 #!/usr/bin/env python import android, time droid = android.Android() titulo = "Seleccione una ciudad" ciudades = ['Valencia','Barquisimeto','Merida','Caracas'] droid.dialogCreateAlert(titulo) droid.dialogSetSingleChoiceItems(ciudades) droid.dialogSetPositiveButtonText('Seleccione') droid.dialogSetNegativeButtonText('Salir') droid.dialogShow() respuesta = droid.dialogGetResponse().result items = droid.dialogGetSelectedItems() if respuesta['which'] == "positive": droid.makeToast("La ciudad seleccionada es: %s " %ciudades[int(items[1][0])]) time.sleep(2) else: droid.makeToast("Saliendo del programa") time.sleep(2)
  • 48.
  • 49.
    Ejemplos: Selección Multiple #!/usr/bin/envpython import android, time droid = android.Android() titulo = "Seleccione las ciudades de su preferencia" ciudades = ['Valencia','Barquisimeto','Merida','Caracas','Maracaibo','Maracay','Margarita'] droid.dialogCreateAlert(titulo) droid.dialogSetMultiChoiceItems(ciudades) droid.dialogSetPositiveButtonText('Seleccionar') droid.dialogSetNegativeButtonText('Salir') droid.dialogShow() respuesta = droid.dialogGetResponse().result items = droid.dialogGetSelectedItems() if respuesta['which'] == "positive": if len(items[1]) == 0: droid.dialogCreateAlert("No se selecciono ciudad alguna") elif len(items[1]) > 0: lista = [] texto = "" cantidad = len(items[1]) c=1 for i in items[1]: lista.append(ciudades[int(i)]) if c <> cantidad: texto = texto + ciudades[int(i)] + "," else: texto = texto + ciudades[int(i)] c = c+1 droid.dialogCreateAlert("Ciudades seleccionada: %s" %texto) else: droid.dialogCreateAlert("Saliendo de la aplicacion") droid.dialogSetPositiveButtonText('Aceptar') droid.dialogShow()
  • 50.
  • 51.
  • 52.
    Ejemplos: Webview <html> <head> <title>Text to Speech</title> <script> var droid = new Android(); var speak = function() { droid.postEvent("say", document.getElementById("say").value); } </script> </head> <body> <form onsubmit="speak(); return false;"> <label for="say">que le gustaria decir?</label> <input type="text" id="say" /> <input type="submit" value="Speak" /> </form> </body> </html>
  • 53.
    Ejemplos: Webview import android droid= android.Android() droid.webViewShow('file:///sdcard/sl4a/scripts/text_to_speech2.html') while True: result = droid.waitForEvent('say').result droid.ttsSpeak(result['data'])
  • 54.
  • 55.
  • 56.
    Más ejemplos Ejecución remotade programas python en el celular: ●Posición del celular en google map http://ernesto-ecrespo.blogspot.com/2011/01/aplicacion-que-muestra-las-coordenadas.html ● Captura de la información de la posición del celular desde Linux http://ernesto-ecrespo.blogspot.com/2010/12/capturar-la-ubicacion-del-celular.html ● Obtener información del estado de la bateria http://ernesto-ecrespo.blogspot.com/2010/12/obtener-informacion-del-estado-de-la.html ● Manejar los mensajes de texto desde Linux http://ernesto-ecrespo.blogspot.com/2010/12/manejar-los-mensajes-de-texto-del.html ● Enviar mensajes de texto desde android con python http://ernesto-ecrespo.blogspot.com/2010/06/enviar-mensajes-de-texto-desde-android.html ● Enviar correo electrónico desde andoird con python http://ernesto-ecrespo.blogspot.com/2010/06/enviar-correo-desde-android-con-python.html ● Más ejemplos en la página oficial http://code.google.com/p/android-scripting/wiki/Tutorials ●
  • 57.
  • 58.
  • 59.
    Referencias: Wikipedia ● http://es.wikipedia.org/wiki/Android ●Sitio oficialde Android http://developer.android.com/guide/basics/what-is-android.html ●Sitio Oficial de SL4A http://code.google.com/p/android-scripting/ ●Presentación Programando en Android de Matias Bordese en PyAr http://python.org.ar/pyar/Charlas#Programando_Python_en_Android ●Blog de Ernesto Crespo http://ernesto-ecrespo.blogspot.com/search/label/Android ●Cellbots, Canal de youtube: http://www.youtube.com/cellbots ●SmallSat http://blog.makezine.com/2010/07/27/nexus-onearduino-smallsat-satellite/ ●Cellbots www.cellbots.com ●Cellbot control: https://github.com/georgegoh/cellbot-controller