Module de Programmation Android (LP PRISM AirFrance)
TD5 - Applications web
Les objectifs de ce TD sont :
le chargement de pages web au sein d'applications Android ;
l'interaction entre les deux.
Pour cela, vous allez réaliser une application chargeant cette propre
page web, et interagissant avec elle pour effectuer d'autres actions.
Mise en place
Commencer une nouvelle application, avec une activité vide nommée par
exemple TD5Activity. Cette application aura besoin
d'accéder à internet: ajouter dans le manifeste, à l'intérieur des
balises manifest (mais en dehors des
balises application), la permission correspondante :
<uses-permission android:name="android.permission.INTERNET" />
Utilisation d'un proxy
Si vous êtes derrière un proxy (notamment, si vous utilisez les machines
de l'IUT), vous devez configurer ce proxy sur la tablette ou
l'émulateur. Pour cela, aller dans les paramètres de la tablette ou
l'émulateur, puis naviguer jusqu'à :
Si le système est en anglais : Wireless & networks/Mobile
networks/Access Point Names/TelKila
Si le système est en français : Sans fil et réseaux/Réseaux
mobiles/Noms des points d'accès/TelKila
Dans Proxy, entrer le nom ou l'adresse IP du proxy (sur les
machines de l'IUT, proxy.iut-orsay.fr).
Dans Port, entrer le port du proxy (sur les machines de
l'IUT, 3128).
Plusieurs façons d'afficher des pages web
Nous allons d'abord explorer plusieurs façons de charger des pages web.
Activités web
Nous avons vu que les intentions étaient dédiées au lancement de
nouvelles activités, et à la communication entre activités. Android
fournit des intentions particulières permettant de lancer des activités
web, dont la seule fonction est l'affichage d'une page web.
Surcharger la méthode onStart de la
classe TD5Activity, de manière à lancer une activité web
affichant cette page:
// Interprétation de l'url
Uri uri = Uri.parse("https://www.lri.fr/~keller/Enseignement/Orsay/LP-PRISM-AF/TD5.html");
// Création de l'intention dédiée aux activités web
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
// Lancement de l'activité web
startActivity(intent);
Ne pas oublier d'appeler également la méthode onStart
de la super-classe.
Tester.
Vues web
Cette façon de procéder peut être utile lorsqu'on souhaite uniquement
afficher une page web, mais ne permet pas d'avoir des objets Android
(boutons, zones de texte, ... etc) en complément de la page web. Pour
cela, il faut utiliser une vue web au sein d'une interface comportant
également d'autres vues.
Supprimer (ou commenter) de la méthode onStart le
lancement de l'activité web décrit ci-dessus.
Créer une interface pour l'activité TD5Activity, de
manière à afficher une zone de texte contenant la chaîne "Vue
web", et en dessous, une vue web, en adaptant le code
suivant :
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webview"/>
Récupérer la vue web dans la méthode onCreate, par
exemple dans une variable nommée webview. Charger la page
web du TD dans cette vue lors de la
méthode onStart : webview.loadUrl("https://www.lri.fr/~keller/Enseignement/Orsay/LP-PRISM-AF/TD5.html");
Tester.
Interaction avec JavaScript
JavaScript permet d'exécuter du code dans des pages web. Dans le cadre
d'applications web Android, ce code peut faire appel à des méthodes
définies au niveau Java, permettant ainsi d'interagir avec le système
Android.
Activation de JavaScript
Par défaut, JavaScript est désactivé dans les vues web. On peut le
tester de la manière suivante : en cliquant sur cette image (ou en
passant le curseur dessus, sur un ordinateur),
zone de test de javascript
le texte est modifié si JavaScript fonctionne, et n'est pas modifié
sinon
(source).
Effectuer ce test.
Activer JavaScript. Pour cela, ajouter à la
méthode onStart :
// Récupération des paramètres associés à la vue web
WebSettings webSettings = webview.getSettings();
// Activation de JavaScript dans ces paramètres
webSettings.setJavaScriptEnabled(true);
Re-tester.
Utilisation de code Android en JavaScript
Voici deux boutons ayant pour but d'afficher une alerte :
Le premier affiche une alerte HTML de manière standard, tandis que le
deuxième a pour but d'afficher une alerte Android.
Tester ces deux boutons dans votre application Android, ainsi que
dans un navigateur sur un ordinateur. Que se passe-t-il ?
Le deuxième bouton cherche à appeler une méthode Java,
nommée alert, pour afficher une alerte Android. Pour
que cela fonctionne, il faut implanter cette méthode.
Créer une classe implantant cette méthode :
// Cette classe doit obligatoirement être publique
public class WebAppInterface {
Context mContext;
// On définit un constructeur qui récupère le contexte de l'activité
WebAppInterface(Context c) {
mContext = c;
}
// Ce mot-clé est obligatoire pour pouvoir appeler la méthode en JavaScript
@JavascriptInterface
// On définit la méthode appelée en JavaScript
public void alert(String toast) {
// On affiche une alerte Android, implantée par la classe Toast
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
La
classe Toast
permet, en Android, d'afficher de petites alertes.
Lier cette classe à la vue web, en ajoutant dans la
méthode onStart : webview.addJavascriptInterface(new
WebAppInterface(this), "Android");
Tester.
Remarque : voici le code HTML des deux boutons :
<input type="button" value="Sans parler à Android" onClick="alert('Je n\'ai pas besoin d\'Android')" />
<input type="button" value="En parlant à Android" onClick="showAndroidAlert('Bonjour Android !')" />
<script type="text/javascript">
function showAndroidAlert(toast) {
Android.alert(toast);
}
</script>
Navigation
Dans l'application Android, cliquer sur un des liens du TD. Que
se passe-t-il ?
Pour pouvoir suivre des liens sans quitter l'application, il faut
utiliser un client web plus complet dans la vue web. Pour cela,
ajouter à la méthode onStart : webview.setWebViewClient(new WebViewClient());
Cela permet de suivre des liens, mais pas de revenir en arrière, ce qui
est une fonctionnalité plutôt utile en navigant sur internet.
Modifier l'interface de TD5Activity afin d'ajouter
deux boutons, un pour revenir à la page précédente, et un pour
ensuite retourner à la page suivante.
Attacher une méthode à ces boutons réalisant l'action voulue, en
utilisant les
méthodes goBack
et goForward
de la
classe WebView.
Tester.
À vous de jouer
Ajouter à l'interface un bouton permettant de rafraîchir la page
web. On pourra utiliser la
méthode reload
de la
classe WebView.
Ajouter à l'interface une zone de texte éditable, dans le but que
l'utilisateur entre une url, et un bouton, de manière à ce que l'url
entrée par l'utilisateur se charge dans le vue web lorsqu'on clique
dessus.
Faire en sorte que l'url se charge lorsqu'on clique également sur
le bouton suivant :
Le code HTML de ce bouton est :
<input type="button" value="Charger l'url se trouvant dans la zone de texte Android" onClick="loadUserUrl()" />
<script type="text/javascript">
function loadUserUrl() {
Android.loadUserUrl();
}
</script>
Pour aller plus loin
Imaginer et implanter un mécanisme d'onglets. On pourra pour cela
utiliser par exemple la
classe ListView,
dont voici
un tutoriel.
Retour à la page du