Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

14sept/105

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/NetworkInterface.html

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>

Télécharger le projet au format FXP

Télécharger l'application au format APK

Articles similaires

Commentaires (5) Trackbacks (0)
  1. 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.

  2. Salut,
    Je ne sais pas si c'est possible en natif

    Fabien

  3. 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 ?

  4. Salut,
    Je ne sais pas trop, ELIXIR sont des composants payants, jamais essayé. Il faut aller voir la doc
    Fabien

  5. 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 .


Leave a comment

(required)

Aucun trackbacks pour l'instant