Yevgeny Simkin
Yevgeny Simkin

Reputation: 28349

loading images and video in AIR without HTTP

I'm curious what the correct methodology is for loading image and video data directly from the file system, without employing HTTP.

I'm writing an AIR slideshow application, and it works great but currently relies on a local MAMP server to hand the app all the media via the standard, tried and true, FLASH media loading methodologies.

I know that since FLASH was developed as a web plugin it handles this way of receiving data best, but I'd really like to extricate this rather onerous and unnecessary bit and have the app as a stand-alone player, however, I'm unclear what the "correct" way is to load the media.

I have the File objects ready and I've gotten as far as having the user select the local directory from which to pull the media and I'm getting a list of the files (based on their extensions) from the list... but now what?

Upvotes: 1

Views: 2255

Answers (2)

Vamoss
Vamoss

Reputation: 925

With this code the Loader fires the Event.COMPLTE event and you will be able to manipulate the Bitmap from it:

var bytes:ByteArray = new ByteArray();
var myFileStream:FileStream = new FileStream();
var myFile:File = File.documentsDirectory.resolvePath(YOUR_PATH);

myFileStream.addEventListener(Event.COMPLETE, fileCompleteHandler)
myFileStream.openAsync(myFile, FileMode.READ);

function fileCompleteHandler(event:Event):void 
{
    myFileStream.readBytes(bytes);

    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
    loader.loadBytes(bytes);

    function imageLoaded(e:Event):void
    {
        addChild(Bitmap(loader.content));
        myFileStream.removeEventListener(Event.COMPLETE, fileCompleteHandler);
        myFileStream.close();
    }
}

PS: Thanks Kodiak, I made my code based on yours.

Upvotes: 1

Kodiak
Kodiak

Reputation: 5978

You first have to put the content of your file in a ByteArray (code from FileStream documentation)

var bytes:ByteArray = new ByteArray();
var myFileStream:FileStream = new FileStream();
var myFile:File = File.documentsDirectory.resolvePath("test.jpg");

myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
myFileStream.openAsync(myFile, FileMode.READ);

function progressHandler(event:ProgressEvent):void 
{
    if (myFileStream.bytesAvailable)
    {
        myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable);
    }
    else
    {
        myFileStream.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
        loadImage();
    }
}

Then you may load these bytes in a Loader to display the image (see method Loader.loadBytes)

function loadImage():void
{
    var loader:Loader = new Loader();
    loader.loadBytes(bytes);    
    addChild(loader);
}

Cheers

Upvotes: 3

Related Questions