Il est souvent nécessaire de récupérer les nouvelles données pour son application sur le réséau Internet. En développement Android, il existe de nombreuses classes pour gérer et utiliser des connexions HTTP. Nous allons apprendre à tester la connectivité de l'appareil et récupérer des données par connexion HTTP pour les convertir en un String.
Manifest
Tout d'abord il faut ajouter deux permissions à notre application :
Ses deux permissions sont à ajouter au fichier manifest.xml.
Tester la connectivité
Il est important de tester si le smartphone ou la tablette est connecté au réseau Internet, soit par réseau Wifi ou réseau 3G. Pour cela il faut utiliser l'objet ConnectivityManager :
Ce test peut être réaliser depuis le Thread principal de notre application. Dans l'exemple précédent, on récupère l'objet ConnectivityManager par rapport au Context actuelle. Ensuite on récupère l'objet NetworkInfo via la fonction getActiveNetworkInfo().
Avec cette objet on peut testé si le smarpthone est connecté via la fonction isConnected() de notre objet NetworkInfo. Ensuite, deux possibilités :
- Si la connexion existe : on appel la tâche asynchrone qui sert à la connexion HTTP avec comme paramètre l'url pour récupèrer les données.
- Sinon on affiche le message comme quoi la connexion n'existe pas.
Le test de la connexion peut être réaliser dans le thread principal car il n'est pas bloquant, par contre la connexion et récupération de donnée par HTTP nécessite l'utilisation d'un Thread différent, d'où l'utilisation d'une tâche asynchrone.
La connexion et la récupération de donnée
Il existe
deux possibilités pour les actions HTTP : l'objet
HttpClient et
HttpURLConnection.
- HttpClient est fournit par Apache et est compatible depuis la version Eclair (2.1).
- HttpURLConnection est fournit par Java et est en développement très actif. Il est compatible depuis la version Gingerbread et utilise de la compression et du cache ce qui permet de réduire le volume de donnée transmis. Donc on gagne en rapidité et en autonomie.
Au final la
deuxième solution est à priviligier pour les nouvelles applications et c'est ce qui sera
presenté ci-dessous. Si vous voulez, un
exemple du
premier choix est disponible
ici.
- La connexion se réalise donc par un objet URL, qui retourne ensuite un objet de type HttpURLConnection via la fonction openConnection()
- Ensuite on peut paramètrer notre connexion (optionnelle), de nombreux paramètres existent. Une fois paramètrer on peut lancer la connexion avec la fonction connect() de HttpURLConnection.
- On peut récupérer le code de réponse avec la fonction getResponseCode() de HttpURLConnection.
- On récupère ensuite le flux de donnée avec la fonction getInputStream().
- On prévoit qu'a la fin ou en cas d'erreur, de déconnecter l'application et de fermer l'InputStream.
Conversion de l'InputStream en String
La fonction readIt aura pour but de convertir l'InputStream en String :
- On récupère notre InputStream pour le convertir en InputStreamReader
- Puis on convertie notre InputStreamReader en BufferedReader
- Ensuite on lit chaque ligne retourné pour les insérer dans notre StringBuilder avec un '\n' pour bien prendre en compte le retour à la ligne.
- Et enfin on retourne notre StringBuilder convertie en String
Pour aller plus loin
Lancer la connexion dans le thread principal
Cette pratique, fortement déconseillée est tout de même réalisable :
Ecrire des données
Il est aussi possible d'écrire des données via une connexion HTTP :
L'authentification HTTP
On peut aussi s'authentifier :
Et tout le reste
Il faut savoir que l'on peut aussi :
- Utiliser les Cookies
- Utiliser d'autre méthode que GET
- Utiliser le cache pour les réponses HTTP
- Utiliser des Proxies
Tout ceci est expliqué sur la documentation officielle d'Android : lien