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

16sept/100

AIR pour Android – Parcourir la carte SD et lire une image avec File et FileStream

Dans le tutorial précédent, on a vu que l'on pouvait accéder à la carte mémoire du portable Android grâce à la classe File et ses propriétés static (userDirectory & co). Tout comme on peut lire des fichiers du disque dur d'un ordinateur avec Air, on peut lire les fichiers de la carte SD du mobile Android.

Dans cette application, je permet de lister le contenu du dossier de la carte SD puis d'ouvrir un fichier par son nom. J'ai fait une sorte de navigateur ultra simplifié, on a le listing à plat des dossiers (sans afficher les dossiers cachés). Lorsque l'on double click dans la liste, cela ouvre le dossier et liste le détail des fichiers / dossiers qui la compose.

Le bouton BACK du téléphone ou le bouton "Browse SD Card" permettent de revenir à la racine de la carte SD.

Lorsque l'on double-click sur un fichier image, celui-ci est chargé dans l'application. J'aurai pu faire l'effort de lire les fichiers audio et texte mais j'ai eu la flemme :P . On peut bien sûr lire n'importe quel fichier (XML, texte, …).

Pour l'ouverture de fichiers, j'utilise les classes File et FileStream:

http://livedocs.adobe.com/flex/3/langref/flash/filesystem/File.html

http://livedocs.adobe.com/flex/3/langref/flash/filesystem/FileStream.html

Code de l'application

<?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.collections.ArrayCollection;
      import mx.events.FlexEvent;
      import mx.events.ListEvent;

      [Bindable]
      private var _files:ArrayCollection = null;

      protected function application1_applicationCompleteHandler(event:FlexEvent):void {
        this.stage.addEventListener(KeyboardEvent.KEY_DOWN, downHandler);
        onGetDirectories();
      }

      public function downHandler(event:KeyboardEvent):void {

        switch (event.keyCode) {
          case Keyboard.BACK:
            // to prevent app going to background use following
            event.preventDefault();
            onGetDirectories();
            //do action related to BACK key
            break;
          case Keyboard.SEARCH:
            //do action related to SEARCH key
            showInfo("SEARCH key");
            break;
          case Keyboard.MENU:
            //do action related to MENU key
            showInfo("MENU key");
            break;
          default:
            break;
        }
      }

      private function onGetDirectories():void {
        var userDirectory:File = File.userDirectory;
        getDirectories(userDirectory);
      }

      private function switchToFileList(value:Boolean):void {
        fileList.visible = fileList.includeInLayout = value;
        mainImage.visible = mainImage.includeInLayout = !value;
      }

      private function getDirectories(file:File):void {
        switchToFileList(true);
        var fileListing:Array = file.getDirectoryListing();
        _files = new ArrayCollection(fileListing);
        _files.filterFunction = filesFilterFunction;
        _files.refresh();
      }

      private function filesFilterFunction(item:Object):Boolean {
        var file:File = item as File;
        if (!file) {
          return false;
        }
        if (file.isHidden) {
          return false;
        }
        return true;
      }

      private function onItemDoubleClick(event:ListEvent):void {
        var selectedFile:File = fileList.selectedItem as File;
        if (!selectedFile) {
          return;
        }
        if (selectedFile.isDirectory && !selectedFile.isHidden) {
          getDirectories(selectedFile);
          return;
        }
        var extension:String = selectedFile.extension.toLowerCase();
        switch (extension) {
          case "jpg":
          case "jpeg":
          case "png":
            getFile(selectedFile);
            break;
        }
      }

      private function getFile(file:File):void {
        if (file) {
          showInfo(file.nativePath);
          var imageData:ByteArray = new ByteArray;
          var stream:FileStream = new FileStream();
          stream.open(file, FileMode.READ);
          stream.readBytes(imageData);
          stream.close();
          mainImage.source = imageData;
          switchToFileList(false);
        } else {
          showInfo("Impossible de récupérer le fichier");
        }
      }

      private function showInfo(text:String):void {
        log.text = text;
      }
    ]]>
  </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="getPictureButton" label="Browse SD Card" click="onGetDirectories();"
                   height="100%" width="100%" enabled="true" />
      </mx:HBox>
      <mx:Label id="log" fontSize="18" />
    </mx:Box>
  </mx:ApplicationControlBar>
  <mx:List id="fileList" dataProvider="{_files}" labelField="name" width="100%" height="100%"
           itemDoubleClick="onItemDoubleClick(event)" doubleClickEnabled="true">
  </mx:List>
  <mx:Image id="mainImage" width="100%" height="100%" visible="false" includeInLayout="false" />
</mx:Application>

Démonstration vidéo

Télécharger le projet au format FXP

Télécharger l'application au format APK

Articles similaires

Commentaires (0) Trackbacks (0)

Aucun commentaire pour l'instant


Leave a comment

(required)

Aucun trackbacks pour l'instant