AIR pour Android – Détecter les interfaces réseau (Wifi) avec NetworkInfo et NetworkInterface
Voici une fonctionnalité qui n'était pas prévue dans Air 2.5 il y a quelques mois et qui finalement est au rendez-vous. En effet, depuis les derniers builds, on a accès à la classe NetworkInfo, même quand on compile pour une application mobile. Cette classe est déjà présente dans Air 2 et permet de lister les interfaces réseau de la machine sur laquelle est lancée l'application.
Sur un mobile, on trouve de nombreuses interface réseau non-actives (préfixées par "mobile_") mais on trouve aussi des informations plus intéressantes comme la présence de l'interface Wi-fi. Vous pouvez ensuite savoir si cette connexion est active et si oui, récupérer son adresse IP et son adresse MAC.
Attention, avoir une interface Wi-fi activée et des adresses IP/MAC ne signifie pas que l'utilisateur a accès au Internet par le Wi-fi. Vous verrez quand dans mon exemple, je me connecte au réseau Free Wifi du voisin. Je suis connecté à ce réseau mais pourtant, je ne reçoit par internet par ce biais (c'est un hotspot, il faut se logger). Je ne sais pas s'il on peut vraiment savoir si la connexion internet provient de la 3G ou du Wifi, vous pouvez simplement savoir si le Wifi est actif.
Pour lister les interfaces, il faut interroger la méthode "findInterfaces()" sur la propriété static "networkInfo" de la classe NetworkInfo:
var networkInfo:NetworkInfo = NetworkInfo.networkInfo; var networkInterfaces:Vector.<NetworkInterface> = networkInfo.findInterfaces();
Documentation
http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/flash/net/NetworkInfo.html
Permissions Android
Pour pouvoir accéder à ces informations, il vous faut ajouter des permissions Android dans le fichier de description:
<android>
<manifestAdditions>
<manifest>
<data>
<![CDATA[
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
]]>
</data>
</manifest>
</manifestAdditions>
</android>
Vidéo de démonstration
Dans cette vidéo, je lance une petite application Air qui va lister les interfaces réseaux et j'affiche un petit descriptif. Dans un premier temps, le Wifi est désactivé donc la propriété "active" de la NetworkInterface" est à false. Ensuite, j'active le Wifi sur mon portable pour montrer la mise à jour de cette valeur.
Code de démonstration
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" paddingLeft="0" paddingRight="0"
paddingTop="0" paddingBottom="0"
applicationComplete="application1_applicationCompleteHandler(event)">
<mx:Style>
global {
font-size: 24;
}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
/**
*
*/
protected function application1_applicationCompleteHandler(event:FlexEvent):void {
if (NetworkInfo.isSupported) {
findInterfacesButton.enabled = true;
} else {
showInfo("NetworkInfo non disponible");
}
}
public function onFindInterfaces():void {
var networkInfo:NetworkInfo = NetworkInfo.networkInfo;
var networkInterfaces:Vector.<NetworkInterface> = networkInfo.findInterfaces();
if (!networkInterfaces) {
showInfo("Aucune interface détectée");
return;
}
ta.text = "";
for each (var networkInterface:NetworkInterface in networkInterfaces) {
var name:String = networkInterface.name;
var isActive:Boolean = networkInterface.active;
var displayName:String = networkInterface.displayName;
var addresses:Vector.<InterfaceAddress> = networkInterface.addresses;
var hardwareAddress:String = networkInterface.hardwareAddress;
ta.text += "Name: " + name + "\n";
ta.text += "isActive: " + isActive + "\n";
ta.text += "Display Name: " + displayName + "\n";
if (addresses.length > 0) {
ta.text += "Adresses:\n";
for each (var address:InterfaceAddress in addresses) {
ta.text += " Adresse: " + address.address + "\n";
}
}
ta.text += "Adresse MAC: " + hardwareAddress + "\n";
ta.text += "----------------------\n";
ta.text += "----------------------\n";
}
}
private function showInfo(text:String):void {
log.text += text + "\n";
}
]]>
</mx:Script>
<mx:ApplicationControlBar left="0" right="0" bottom="0" height="80" paddingTop="8" paddingLeft="8"
paddingBottom="8" paddingRight="8" horizontalGap="8" verticalGap="8"
dock="true">
<mx:Box width="100%">
<mx:HBox>
<mx:Button id="findInterfacesButton" width="100%" height="100%" label="Find Interfaces"
click="onFindInterfaces()" enabled="false" />
</mx:HBox>
<mx:Label id="log" fontSize="18" />
</mx:Box>
</mx:ApplicationControlBar>
<mx:TextArea id="ta" backgroundColor="white" width="100%" height="100%" selectable="false" />
</mx:Application>
Articles similaires
- AIR Mobile – Détecter la présence d'une connexion Wifi ou 3G
- AIR pour Android – Sortie d'une nouvelle pre-release avec support des composants Flex 4 et Camera
- AIR pour Android – Debug sur mobile FroYo / emulateur avec Flash Builder 4
- AIR pour Android – Ouvrir une application depuis une URI avec arguments
- AIR pour Android – Quitter une application Android proprement (arrêt GPS …)
Aucun trackbacks pour l'instant






16 août 2011
Bonjour,
Je voudrais savoir si avec AS3 on peut scanner un réseau et détecter par la suite tous les périphériques qui sont sur ce réseau ?
Merci.
16 août 2011
Salut,
Je ne sais pas si c'est possible en natif
Fabien
16 août 2011
J'ai fais un tour sur Tour de Flex et j'ai trouvé dans la catégorie Data Visualisation un machin nommé IBM LOG ELIXIR. Ils ont fait un exemple de moniteur réseau. Peux tu me donner plus de détails sur IBM LOG ELIXIR et selon toi est ce qu'il peut m'aider à résoudre mon problème ?
16 août 2011
Salut,
Je ne sais pas trop, ELIXIR sont des composants payants, jamais essayé. Il faut aller voir la doc
Fabien
16 août 2011
Ok, je suis en train de télécharger la version d'évaluation pour 90 jours. Je vais l'essayer et si elle parvient à faire ce que je veux, je crois que mon boss l'achètera. Encore merci .