Bloc-notes
Math Lycée
Info Lycée
Menu contextuel
Installation de Python sur Android
[ZDP450]
SL4A (Script Layer for Android) est une application qui permet d'exécuter des scripts Python sur un appareil Android.

La page http://code.google.com/p/android-scripting/ décrit la marche à suivre pour installer le SL4A. Il vous faudra ensuite installer l'application Python for Android qui contient l'interpréteur Python. Cette application est disponible sur le market Android.

Les scripts doivent être copiés dans le répertoire /sdcard/sl4a/scripts/. Ce répertoire contient déjà quelques exemples de scripts.

Une façon très commode d'accéder au système de fichiers de l'appareil Android depuis votre ordinateur est d'installer l'application SSHDroid depuis le market. Vous pourrez alors accéder aux répertoires de l'appareil Android via le protocole SFTP. Sous Ubuntu par exemple, pour voir le système de fichiers Android depuis l'explorateur Nautilus, utilisez le menu « /Fichier/Se connecter à un serveur... » Choisissez alors le type SSH et le port 2222. Indiquez l'adresse IP de l'appareil, le nom d'utilisateur 'root' et le mot de passe ('admin' par defaut). Les options de l'application SSHDroid permettent de changer ce mot de passe. Il possible également d'utiliser une paire de clés privée/publique pour une meilleure sécurité et plus de confort.

Les scripts présents dans le répertoire /sdcard/sl4a/scripts/ de l'appareil peuvent alors être modifiés avec votre éditeur de texte favori comme s'ils étaient présents sur votre ordinateur. Utilisez l'application SL4A pour exécuter les scripts sur l'appareil Android.

L'accès aux fonctions systèmes de l'appareil se fait au travers de l'API :

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

Une autre page intéressante est disponible ici :

http://www.mithril.com.au/android/doc/index.html

Le parcours de cet API vous donnera certainement de nombreuses idées stimulantes de petits TP ou de grands projets pour vos élèves.

Voici ci-dessous un exemple de script Python qu'il est possible d'exécuter sous Android. Ce script lit sur l'internet un fichier XML qui contient les données en temps réel donnant la disponibilité des vélos STAR dans chacune des stations. La structure de ce fichier est décrit ici :

http://data.keolis-rennes.com/fr/les-donnees/v2/getbikestations.html
# -*- coding: utf-8 -*-

"""velostar -- Localisation de la station vélo STAR la plus proche 
            -- version du 13/06/12
            
    Le script lit la position locale de l'appareil puis se connecte
    au site data.keolis-rennes.com afin de rechercher la station
    vélo STAR (le vélib de Rennes) la plus proche qui a au moins un vélo
    disponible. L'information est lue à l'utilisateur de l'appareil
    et la station est affichée dans Google Maps
    
    Pour les utilisateurs non rennais le script donnera une réponse
    certes correcte mais tout à fait sans intérêt !
            
    Le but est d'illustrer l'utilisation du SL4A.
    Ce script peut servir de point de départ pour une application 
    plus sophistiquée ayant une véritable utilité pratique.
"""

__author__ = 'Denis Pinsard'
__email__ = 'denis.pinsard@dichotomies.fr'

import android
import time
from math import pi, asin, sin, cos
from urllib import urlopen, urlencode
from xml.etree import ElementTree as xml

RAYON = 6378000         # Rayon de la Terre en mètres

droid = android.Android()

# On tente une localisation GPS pendant 10 secondes
droid.ttsSpeak("Localisation en cours, veuillez patienter")
droid.startLocating()
for i in range(10):
    time.sleep(1)
    loc = droid.readLocation().result
    if loc != {}:
        break
droid.stopLocating()

# Si la localisation a échouée
if loc == {}:
    # on utilise la dernière localisation connue
    loc = droid.getLastKnownLocation().result
    
# On utilise de préférence la localisation par GPS à celle fournie par le réseau GSM
if 'gps' in loc:
    position = loc['gps']
else:
    position = loc['network']
locale_lat = position['latitude'] 
locale_long = position['longitude']

# On récupère le nom de la rue et la ville associée à la position
adresse = droid.geocode(locale_lat, locale_long).result
droid.ttsSpeak(adresse[0][u'thoroughfare'])
droid.ttsSpeak(adresse[0][u'locality'])

# Conversion en radians des coordonnées locales
locale_lat_rad = locale_lat / 180 * pi
locale_long_rad = locale_long / 180 * pi

# Lecture de l'état des stations Vélos STAR
BASE_URL = 'http://data.keolis-rennes.com/xml/?'
requete = dict()
requete['version'] = '2.0'
requete['key'] = 'AJK6ZZOW4YPI73R'
requete['cmd'] = 'getbikestations'
url = BASE_URL + urlencode(requete)
print('REQUÊTE: ' + url)
flux = urlopen(url)
racine = xml.parse(flux)
stations = racine.findall('answer/data/station')

# Recherche de la station la plus proche qui dispose d'au moins un vélo
station_distance = None
station_velos = 0
for station in stations:
    velos = int(station.find('bikesavailable').text)
    if velos > 0:
        lat = float(station.find('latitude').text)
        long = float(station.find('longitude').text)
        lat_rad = lat / 180 * pi
        long_rad = long / 180 * pi
        # Calcul de la distance de la station à vol d'oiseau
        distance = RAYON * (pi/2 -
                    asin(sin(lat_rad) * sin(locale_lat_rad) +
                         cos(long_rad - locale_long_rad)
                         * cos(lat_rad) * cos(locale_lat_rad)))
        if station_velos == 0 or station_distance > distance:
            # Mémorisation du nom, de l'adresse, du nombre de vélos et de la distance
            # de la station
            station_lat = lat
            station_long = long
            station_nom = station.find('name').text
            station_adresse = station.find('address').text.lower()
            station_velos = velos
            station_distance = distance
            
# Lecture des informations concernant la station la plus proche
print station_nom.encode('utf-8')
print station_velos
print station_adresse.encode('utf-8')
print station_distance
droid.ttsSpeak("%d vélo sont disponibles à la station %s"
                    % (station_velos, station_nom))
droid.ttsSpeak("Elle se trouve %s" % station_adresse)
droid.ttsSpeak("À vol d'oiseau, la distance est d'environ %d mètres"
                    % station_distance)
                    
# Affichage de la station dans Google Maps
droid.viewMap("%f %f" % (station_lat, station_long))



Denis Pinsard -- Mis à jour le mercredi 13 juin 2012

Infos site
Visites

 0 visiteurs

 1 visiteur en ligne

Calendrier
^ Haut ^