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
. 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
Articles similaires
- AIR pour Android – Détecter l'appui sur les boutons BACK, MENU et SEARCH (hardware)
- AIR pour Android – Utilisation des propriétés static de File (userDirectory, applicationDirectory…)
- AIR Mobile – Prendre une photo (CameraUI ou CameraRoll) et garder les headers intacts
- AIR Mobile – Application Pokémon (30) – Lecture des images et des mp3 depuis la carte SD
- AIR pour Android – Enregistrer une image dans la galerie avec CameraRoll et addBitmapData
Aucun trackbacks pour l'instant





