Desarrollo de aplicaciones android con Python

Post on 29-Jan-2018

161 views 1 download

Transcript of Desarrollo de aplicaciones android con Python

Python – Android

Manuel Aznar

manuel.aznar@neodoo.es

Noviembre de 2011

Indice

● Introducción a Android● SL4A● Ejemplos básicos● Ejemplos avanzados● Ejercicio● Generación de un APK instalable en el móvil

Android

● Es un sistema operativo basado en GNU/Linux

● Para dispositivos móviles (teléfonos inteligentes

y tabletas)

● Desarrollado inicialmente por Android Inc.

Comprada por Google en 2005

● Lo componen el sistema operativo, librerías,

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

Versiones de Android

Crecimiento de Android

Arquitectura de Android

Market Android I

Market Android II

Market Android III

Market Android IV

Market Android V

Market Android VI

● Un único pago de 25$

● Si la aplicación es de pago el reparto de los beneficios es de 30% Google, 70% Desarrollador

● Hay otros markets como el de Amazon, Motorola, Vodafone, ... con distintas condiciones

Componentes de una aplicación

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

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

●Broadcast y Intent Receivers: Reciben y reaccionan a anuncios,

no UI

●Content Providers: Proveen acceso a datos a otras aplicaciones

SL4A: Scripting Layer for Android

SL4A hace posibles crear rapidamente prototipos de aplicaciones para Android en el mismo dispositivo usando lenguajes de scripting de alto nivel.

Esos scripts tienen acceso a muchas de las APIs disponibles por la aplicaciones desarrolladas en Java con un interface simplificado.

SL4A: ¿Por qué?

● ¿Es suficientemente fácil escribir programas para Android? Sí. ¿Entonces?● El entorno de desarrollo de Android te hace la vida más fácil. Pero te obliga a tener un ordenador para trabajar. ● SL4A es una nueva idea para poder trabajar en una situación en la que necesites algo rápidamente. Después de que se haya aprendido se puede pasar a hacer una aplicación real.

SL4A: ¿Cómo?

● SL4A provee de una fachada que hace llamadas al API via JSON RPC. ● ¿SL4A compila los programas a Dex bytecode o hay una capa adicional de interpretación?● Depende del lenguaje. Python es una versión de C que arranca nativamente.

SL4A: ¿Rendimiento?

● Se centra sobre todo en el desarrollo rápido y sencillo mas que en el rendimiento.

● Si importa mucho el rendimiento es mejor usar el SDK o el NDK, donde se tiene más control sobre el sistema.

SL4A: Características● 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

SL4A: 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.

● URL:

http://code.google.com/p/android-scripting/wiki/ApiReference

SL4A: ¿API completa?

● BeanShell, JRuby, y Rhino tienen básicamente un API completa ya que invocan a Java directamente.● Los lenguajes interpretados como Python son más restrictivos. Ellos solo tienen acceso al API expuesto a través de la capa RPC.● Mirar la referencia al API para saber la lista de las cosas que estan soportadas. ● La capa RPC se puede extender fácilmente.

http://code.google.com/p/android-scripting/wiki/ApiReference

SL4A: Lenguajes soportados

● Shell

● PHP

● JRuby

● Perl

● Python● Lua

● BeanShell

● Rhino

● 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 de SL4A

Instalación del interprete de PythonAl 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

Se lista los scripts en python de ejemplo para trabajar con

Android

Herramientas para el desarrollo

● Instalar JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index.html

● Instalar Android SDKhttp://developer.android.com/sdk/index.html

● Instalar ANThttp://ant.apache.org

● Instalar Eclipse http://www.eclipse.org

● Instalar plugin Eclipse-Androidhttp://developer.android.com/sdk/eclipse-adt.html

Crear APK

Para hacerlo con Ant:● Descomprimir el script_for_android_template.zip● Poner la variable de entorno "ANDROID_SDK"● Poner el paquete del proyecto :

sh configure_package.sh <nombre del paquete de la aplicacion> ● Cambiar el nombre del proyecto en el "build.xml"● Ejecutar "ant release" para crear el APK

Ejemplos: Hola Mundo

import androiddroid = android.Android()droid.makeToast('Hello, Android!')print 'Hello world!'

Ejemplos: Entrada de datos

import androiddroid = android.Android()texto = droid.dialogGetInput("Escriba su nombre","Nombre:")droid.makeToast('Hola %s' %texto[1])

Ejemplos: Entrada de datos

Ejemplos: Entrada de datos

Ejemplos: Notificaciónimport android

droid = android.Android()

droid.notify('Prueba' , 'Hola Mundo 3!')

Ejemplos: Notificación

Ejemplos: Botones#!/usr/bin/env pythonimport androiddroid = 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: Menús

import androiddroid=android.Android()

droid.addOptionsMenuItem("Si","si",None,"star_on")droid.addOptionsMenuItem("No","no","No","star_off")droid.addOptionsMenuItem("Salir","off",None,"ic_menu_revert")

print "Presiona el menu para ver opciones extra.."print "En 10 segundos se saldra si no hace nada"

while True: # Wait for events from the menu. response=droid.eventWait(10000).result if response==None: break print response if response["name"]=="off": breakprint "Hecho."

Ejemplos: Enviar email

import android

droid = android.Android()

asunto = "Prueba de envio de correo desde Android con un script de python"para = "xxxx@neodoo.es"cuerpo_correo = "Esta es una prueba de envio de correo\n El tiempo en el reloj es: %s\n ------\n Curso de Python\n" %time.ctime()

#Se llama a la funcion sendEmail con los datos necesarios.#Esto llama a la aplicacion de envio de correo de forma grafica con la#informacion que se pasa en la funcion.droid.sendEmail(para,asunto,cuerpo_correo)

#Se finaliza la instancia de la clase.droid.exit()

Ejemplos: Enviar SMS

#Importando el módulo android y el módulo timeimport android,time

#Creando la instancia droid del objeto Androiddroid = android.Android()

#Asignando el número de teléfono y mensajetelefono ="034777777777"mensaje = "Esta es una prueba de envio de sms a la hora %s" %time.ctime()

#Enviar mensaje a la pantalla de android con la info del número y mensajedroid.makeToast("enviando mensaje a %s, con el siguiente contenido: %s" %(telefono,mensaje))

#Enviando el mensaje de textodroid.smsSend(telefono,mensaje)

Ejemplos: Llamar

#Importando el módulo android y el módulo timeimport android

#Creando la instancia droid del objeto Androiddroid = android.Android()

#Asignando el número de teléfonotelefono ="034777777777"

#Llamando al numero de telefono dadodroid.phoneCallNumber(telefono)

Ejemplos: Propone llamar

#Importando el módulo android y el módulo timeimport android

#Creando la instancia droid del objeto Androiddroid = android.Android()

#Asignando el número de teléfono y mensajetelefono ="034777777777"

#Propone llamar al numero de telefono dadodroid.phoneDialNumber(telefono)

Ejemplos: Geolocalizaciónimport androidfrom time import sleep

#Se crea la instancia de la clase Androiddroid = android.Android()#Se inicia la localizaciondroid.startLocating()#Se espera 15 segunfossleep(15)#Se presenta en la consola la información de la localización#Se maneja la información de un diccionario.print "Altitud: ",droid.readLocation().result["network"]["altitude"]print "Proveedor: ",droid.readLocation().result["network"]["provider"]print "Latitud: ",droid.readLocation().result["network"]["latitude"]print "Longitud: ",droid.readLocation().result["network"]["longitude"]print "Tiempo: ",droid.readLocation().result["network"]["time"]print "Velocidad: ",droid.readLocation().result["network"]["speed"]print "Precisión: ",droid.readLocation().result["network"]["accuracy"]#Se detiene la localizacióndroid.stopLocating()

Ejemplos: Chat por bluetooth Iimport androidimport time

droid = android.Android()droid.toggleBluetoothState(True)droid.dialogCreateAlert('¿Eres el servidoe?')droid.dialogSetPositiveButtonText('Si')droid.dialogSetNegativeButtonText('No')droid.dialogShow()result = droid.dialogGetResponse()is_server = result.result['which'] == 'positive'if is_server: droid.bluetoothMakeDiscoverable() droid.bluetoothAccept()else: droid.bluetoothConnect()

Ejemplos: Chat por bluetooth II

if is_server: result = droid.getInput('Chat', 'Pon tu mensaje').result if result is None: droid.exit() droid.bluetoothWrite(result + '\n')

while True: message = droid.bluetoothReadLine().result droid.dialogCreateAlert('Chat recibido', message) droid.dialogSetPositiveButtonText('Ok') droid.dialogShow() droid.dialogGetResponse() result = droid.getInput('Chat', 'Pon tu mensaje').result if result is None: break droid.bluetoothWrite(result + '\n')

droid.exit()

Ejemplos: Hacer una foto

import android

droid = android.Android()droid.cameraCapturePicture('/sdcard/foo.jpg')

Ejemplos: Text-To-Speech

import android

droid = android.Android()message = droid.dialogGetInput('TTS', '¿Que quieres decir?').resultdroid.ttsSpeak(message)

Ejemplos: Mensajería Iimport androidimport xmpp

_SERVER = 'talk.google.com', 5223

def log(droid, message): print message self.droid.ttsSpeak(message)

class SayChat(object):

def __init__(self): self.droid = android.Android() username = self.droid.dialogGetInput('Usuario').result password = self.droid.dialogGetInput('Password').result jid = xmpp.protocol.JID(username) self.client = xmpp.Client(jid.getDomain(), debug=[]) self.client.connect(server=_SERVER) self.client.RegisterHandler('message', self.message_cb)

Ejemplos: Mensajería II if not self.client: log('Ha fallado la conexion!') return auth = self.client.auth(jid.getNode(), password, 'botty') if not auth: log('Ha fallado la autentificacion!') return self.client.sendInitPresence()

def message_cb(self, session, message): jid = xmpp.protocol.JID(message.getFrom()) username = jid.getNode() text = message.getBody() self.droid.ttsSpeak('%s dice %s' % (username, text))

def run(self): try: while True: self.client.Process(1) except KeyboardInterrupt: pass

saychat = SayChat()saychat.run()

Ejemplos: Batería I#!/usr/bin/env python2.6# -*- coding: utf-8 -*-import androiddroid = android.Android()

#Se monitoriza la bateriadroid.batteryStartMonitoring()

#Se captura la información de la bateriabateriaHealth = droid.batteryGetHealth()[1]if bateriaHealth == 2: print "La bateria está bien"elif bateriaHealth == 1: print "Salud de la Bateria desconocido"elif bateriaHealth == 3:

print "La bateria tiene sobrecarga"elif bateriaHealth == 4: print "La bateria está muerta"elif bateriaHealth == 5: print "La bateria tiene sobrevoltaje"else: print "falla desconocida"

Ejemplos: Batería II#Se captura el tipo de conexión que usa el dispositivotipoConexion = droid.batteryGetPlugType()[1]if tipoConexion == 0: print "Cable desconectado"elif tipoConexion == 1: print "Fuente de alimentación: cargador AC"elif tipoConexion == 2: print "Fuente de alimentación: cable USB"else: print "Desconocido"#Se captura lel estatus de la bateriaestatus = droid.batteryGetStatus()[1]if estatus == 2: print "Bateria cargandose"elif estatus == 3: print "Bateria descargandose"elif estatus == 4: print "Bateria no se está cargando"elif estatus == 5: print "Bateria full de carga"

Ejemplos: Batería III

print "Tipo de tecnología: ",droid.batteryGetTechnology()[1]print "Temperatura: ",droid.batteryGetTemperature()[1]print "voltaje: ",droid.batteryGetVoltage()[1]

#Se deja de monitorizar la bateriadroid.batteryStopMonitoring()

Ejemplos: SQLite

import sqlite3

# Connect to database file, create it if it does not existconn = sqlite3.connect('/sdcard/sqlitedemo.db')# Get a cursorcursor = conn.cursor()# Create a tablecursor.execute("CREATE TABLE IF NOT EXISTS gente (texto)")# Insert some datacursor.execute("INSERT INTO gente VALUES ('Juan Ramirez Sanchez')")cursor.execute("INSERT INTO gente VALUES ('Alejandro Garcia Garcia')")conn.commit()# Read the data back outcursor.execute("SELECT * from gente")for row in cursor: print row

conn.close()

Más ejemplos

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

Mandar la posición y hora por Email I

● Que escuche los SMS● Si le llega un SMS con la palabra “GPS”● Hacer que capture la posición GPS del móvil● Que la envíe por email aun contacto● Que la meta como evento en el Google Calendar

Mandar la posición y hora por Email II# -*- coding: utf-8 -*-

try: from xml.etree import ElementTree # for Python 2.5 usersexcept ImportError: from elementtree import ElementTreeimport gdata.calendar.serviceimport gdata.serviceimport atom.serviceimport gdata.calendarimport atomimport androidimport sysimport timeimport urllib2from string import splitfrom string import find

droid = android.Android()

Mandar la posición y hora por Email IIIdef servicio(): while True: time.sleep(10)

# Escuchar los mensajes SMS msg_solicitud = droid.smsGetMessages(True) for i in msg_solicitud.result: msg_sms = i["body"].strip().upper() if msg_sms == "GPS": droid.makeToast(u"Solicitud de localización recibida") droid.smsMarkMessageRead([i["_id"]], True) telefono = i["address"] enviar_mensaje(telefono)

droid.makeToast(u"%s: %s" % (telefono,msg_sms)) if __name__ == "__main__": servicio()

Mandar la posición y hora por Email IV

def enviar_mensaje(numero): try: mensaje, mapa = localizar() msg = "%s %s" % (mensaje, mapa)

asunto = u"Respuesta a la peticion de localización GPS desde el numero %s" % (numero)

para = "xxxx666@gmail.com" droid.sendEmail(para, asunto, msg.encode('ascii', 'replace'))

droid.makeToast(u"Enviada respuesta")anadirEvento(msg)droid.makeToast(u"Evento añadido al calendario")

except: droid.makeToast("Error: " + str(sys.exc_info()[0]))

Mandar la posición y hora por Email Vdef localizar(): droid.makeToast(u"Empezando a localizar la posicion") droid.startLocating(3600,1) time.sleep(10) fin = True segundos = 300 seg_trancurridos = 0 while fin: time.sleep(1) seg_trancurridos += 1 l = droid.readLocation() ll = l.result if "gps" in ll: mensaje = u"Posición actual: " pos = (str(ll["gps"]["latitude"]), str(ll["gps"]["longitude"])) fin = False droid.makeToast(u"Posición GPS encontrada")

Mandar la posición y hora por Email VI else: if seg_trancurridos == segundos: fin = False if "network" in ll: pos = (str(ll["network"]["latitude"]), str(ll["network"]["longitude"])) mensaje = u"Posición red celular: " droid.makeToast(u"Posición Red Celular encontrada") else: ll = droid.getLastKnownLocation().result pos = (str(ll["network"]["latitude"]), str(ll["network"]["longitude"])) mensaje = u"Ultima posición red celular: " droid.makeToast(u"No se pudo establecer conexión, se enviara la ultima posición registrada") droid.makeToast(u"Terminado de localizar la posicion") pll = "%s,%s" % (str(pos[0]), str(pos[1])) mapa = "http://maps.google.com/maps?ll=%s&q=%s" % (pll, pll) droid.stopLocating() return mensaje, mapa

Mandar la posición y hora por Email VIIdef anadirEvento(mensaje):

EMAIL_USER = 'xxxx@gmail.com'EMAIL_PSWD = 'xxxxxxxx'

calendar_service = gdata.calendar.service.CalendarService()calendar_service.email = EMAIL_USERcalendar_service.password = EMAIL_PSWDcalendar_service.source = 'Android'calendar_service.ProgrammaticLogin()

event = gdata.calendar.CalendarEventEntry()event.content = atom.Content(text=mensaje)event.quick_add = gdata.calendar.QuickAdd(value='true')

Mandar la posición y hora por Email VIII

# Send the request and receive the response: while True:

# Sometime Google Calendar service returns an error. This keeps trying until there's no error.

try: new_event = calendar_service.InsertEvent(event,

'/calendar/feeds/default/private/full') break

except gdata.service.RequestError as inst: if inst[0]['status'] == 302: time.sleep(1.0) continue raise except: raise

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/