[WikiItic] [TitleIndex] [WordIndex

Introducció a aplicacions per Android

Aquest taller pretèn donar a conèixer una plataforma en desenvolupament que permet dissenyar scripts en en Python per ser executats en Smartphones amb SO Android.

La plataforma es diu SL4A, que significa Scripting Layer for Android, i és una llibreria python de funcions que permeten aprofitar els perifèrics dels telèfons intel·ligents com l'accleleròmetre, el mòdul bluetooth, la càmara, etc.

SL4A està dissenyada per desenvolupadors i està en fase de qualitat alpha.

Requisits pel taller

Instal·lació de l'entorn

  1. Descarregar del Google Apps l'aplicació de lectura de QR i Codi de Barres: Barcode Scanner
  2. Fer una foto al QR de la url següent: AndroidScripting, que instal·la l'aplicacio SL4A.

  3. Instal·lar el paquet en el smartphone. Si hi ha algun problema de permisos, cal modificar la configuració de l'Smartphone perque accepti software de 3ers: Ajustes>Seguridad>Fuentes desconocidas

  4. Entrar a l'aplicació SL4A>View>Interpreters>Add>Python 2.6.2, això descarregarà l'intèrpret en el telèfon.

  5. Instal·lar l'Android Debugging Bridge (adb command) en el nostre portàtil:

      sudo add-apt-repository ppa:nilarimogard/webupd8 # Afegim un repositori
      sudo apt-get update                              # Actualitzem
      sudo apt-get install android-tools-adb           # Instal·lem la comanda adb
  1. Cal provar que, un cop fet els passos anteriors, si executem la comanda "adb devices", amb el nostre SmartPhone connectat via USB, hauria de detectar-lo i llistar la seva adreça MAC, per exemple:

   ferran@ferran-laptop:~$ adb devices 
   List of devices attached 
   4790046025f8bf1c     device

En cas que no el detecti, cal comprovar que la opció de Depuració de USB del mòbil està activada. La podem trobar a: Settings>Opciones de desarrollador>Depuración USB.

Instruccións i comandes útils

Un cop ja tenim l'entorn muntat, la idea és programar còmodament en el nostre portàtil i, un cop tinguem l'script fet, traspassar-lo cap al Smartphone on serà executat.

La pàgina oficial on podem trobar tota la documentació del projecte SL4A: http://code.google.com/p/android-scripting/

Més concretament, l'API de la llibreria android la podem trobar a: http://code.google.com/p/android-scripting/wiki/ApiReference

La comanda per traspassar un script del PC cap al Smartphone:

  adb push /path/to/script /path/to/smartphone

En concret, els scripts cal copiar-los sota /path/to/sl4a/scripts/, que normalment serà /storage/sdcard0/sl4a/scripts.

Un cop copiat, si accedim a l'aplicació SL4A ja ens apareixerà l'script en qüestió. Per executar-lo es polsa sobre el nom de l'script i es polsa sobre la rodeta o bé sobre la terminal.

Funcions de l'API interessants

En aquest apartat es comenten alguns dels mètodes més bàsics i alhora interessants que podem trobar per fer les primeres proves com a programadors d'aplicacions Android. Per més informació cal visitar la referència completa: http://code.google.com/p/android-scripting/wiki/ApiReference

Funcions simples

Interfície d'Usuari

Utilització dels sensors

Localització GPS

Per fer una lectura de la latitud i longitud en la que es troba el dispositiu cal fer el següent:

Utilització del Bluetooth

Tot i que la facade Bluetooth(BT) és molt extensa, explicarem una breu descripció de les funcions bàsiques per utilitzar el BT. Partim de que la comunicació BT consta de un client i un servidor. On el servidor està esperant i el client demana al servidor l'establiment de la connexió.

Utilització de la càmera

Propostes d'scripts

Aquí es llisten tot un següit d'idees que es poden arribar a implementar fàcilment utilitzant les funcions que hem vist amb una mica de gràcia:

Detector boca-avall

Dissenyar un script que detecti quan el telèfon està boca-avall. Quan això passi cal que avisi d'alguna forma: Fent vibrar el telèfon, emetent algun so, enviant un correu...

Pistes:

Possible solució:

   1 # -*- coding: utf-8 -*- 
   2 import android, time
   3 
   4 # Aquest script consulta periòdicament l'acceleròmetre per tal de
   5 # determinar si el telèfon mòbil és cap per vall. En cas que així sigui
   6 # emet un so d'avis i vibra.
   7 
   8 # Creem l'objecte Android
   9 droid = android.Android()
  10 
  11 # Definim l'interval de consulta als sensors
  12 droid.startSensingTimed(2,5) # 2: escollim l'acceleròmetre, 5: període en milisegons
  13 
  14 while True:
  15     time.sleep(0.005) # Anem a dormir justament un temps de període per tal de no repetir lectures
  16     [ax, ay, az] = droid.sensorsReadAccelerometer().result # Agafem el resultat de la lectura
  17     print az
  18     if az != None and az < -8:
  19         droid.vibrate(500)
  20         droid.ttsSpeak("Oju peligru")
  21         time.sleep(1)
  22 
  23 droid.stopSensing() # Parem les lectures dels sensors
  24 droid.exit() # Marxem del programa

Disseny d'un nivell

Dissenyar un nivell: La idea seria, a partir de les lectures de l'acceleròmetre en algun dels eixos, aconseguir que una barra de progrés horitzontal estigui al 50% quan el dispositiu està plè i varii el seu percentatge en funció de la inclinació en l'eix indicat.

Pistes per la barra horitzontal:

Solució:

   1 # -*- coding: utf-8 -*-                                                                                          
   2 import android, time, math
   3 
   4 # Aquest script implementa un nivell utilitzant l'acceleròmetre. Crea 
   5 # una barra de progrés horitzontal que indica la inclinació del 
   6 # telèfon en l'eix X. 
   7 
   8 # Creem l'objecte Android 
   9 droid = android.Android()
  10 
  11 # Creem una finestra de barra horitzontal de progrés
  12 droid.dialogCreateHorizontalProgress('Nivell d\'inclinació', 'El 100% són', 100)
  13 # Fem que aparegui per pantalla                                  
  14 droid.dialogShow()
  15 
  16 Period_ms = 5
  17 Duration_s = 25
  18 
  19 # Definim l'interval de consulta als sensors 
  20 droid.startSensingTimed(2,Period_ms) # 2: escollim l'acceleròmetre, 5: període en milisegons                     
  21 droid.dialogSetCurrentProgress(50) # Definim l'estat inicial del progrés (50%: a la meitat)  
  22 
  23 i = 0
  24 value = 0
  25 while i < (Duration_s)/(Period_ms*1e-3):
  26     i += 1
  27     time.sleep(Period_ms*1e-3) # Anem a dormir justament un temps de període per tal de no repetir lectures 
  28     [ax, ay, az] = droid.sensorsReadAccelerometer().result # Agafem el resultat de la lectura
  29     if ax:
  30         ax = ax*(-1)
  31         ax = ax + 9
  32         if ax < -0.99:
  33             value = 0
  34         elif ax > 18.99:
  35             value = 100
  36         else:
  37             value = (ax*100)/18
  38         value = math.trunc(value)
  39         droid.dialogSetCurrentProgress(value) # Fixem el nou valor de progrés de la barra horitzontal
  40 
  41 droid.dialogDismiss() # Fem desaparèixer la finestra            
  42 droid.stopSensing() # Parem les lectures dels sensors 
  43 droid.exit() # Marxem del programa

Foto temporitzada

Dissenyar un script que faci una fotografia temporitzada. La idea és que mostri un menú on es demana a l'usuari el temps en segons que vol esperar a fer la fotografia. Un cop s'ha seleccionat, s'espera el temps indicat i la fa.

   1 # -*- coding: utf-8 -*- 
   2 import android
   3 from time import sleep
   4 import os 
   5 
   6 # Aquest script implementa el sistema de fer una fotografía
   7 # temporitzada. Demana a l'usuari el temps d'espera desitjat, s'espera
   8 # i fa la fotografia.
   9 
  10 ruta = "/storage/sdcard0/sl4a/scripts/fw13"
  11 
  12 #Missatges
  13 title = 'Captura d\'una foto'
  14 message = ('Vol capturar una foto?') 
  15 
  16 droid = android.Android()
  17 
  18 #Se crea el mensaje si se desea tomar la foto.
  19 droid.dialogCreateAlert(title, message)
  20 droid.dialogSetPositiveButtonText('Si')
  21 droid.dialogSetNegativeButtonText('No')
  22 droid.dialogShow()
  23 
  24 resposta = droid.dialogGetResponse()
  25 
  26 if resposta[1]['which'] == "positive":
  27     temps = droid.dialogGetInput("Escrigui el temps despera per capturar la foto (en segons)","Temps:")
  28     droid.makeToast("El temps despera es de: %s segons" %temps[1])
  29     sleep(int(temps[1]))
  30 
  31     if os.path.isfile("%s/latest.png" %ruta) == True:
  32         os.remove("%s/latest.png" %ruta)
  33 
  34     droid.cameraCapturePicture("%s/latest.png" %ruta)
  35     nom = droid.dialogGetInput("Amb quin nom la voleu desar?","Nom:")
  36 
  37     command = "mv %s/latest.png %s/%s.png"%(ruta, ruta, nom.result)
  38     os.system(command)
  39     
  40     droid.makeToast("Fi del programa")
  41 else:
  42     droid.makeToast('Fi del programa')

Lector de codi de barres mòbil

Dissenyar un script que permeti llegir els codis de barres dels productes d'una comanda entrant. Cal poder seguir entrant productes fins que no es digui el contrari. La idea és guardar el codi del producte i el nombre d'unitats. En el moment que s'acaba d'entrar comandes, s'envia per BlueTooth els resultats cap a un ordinador central, que podría ser el nostre portàtil, on es tractaran les dades en un full de càlcul.


2023-07-03 11:45