Search code examples
iosactionscript-3airstarling-framework

Security Error when trying to load ByteArray from mediaPromise


in a mobile application i need to send an image which the user either took with the camera or picked from a cameraroll. I am using the starling framework and feathersUI ( although i think this does not matter to problem ) When the mediapromise is loaded using loadFilePromise i use the following code to deal with the image data:

_mediaLoader = new Loader()
//loading the filePromise from CameraRoll
_mediaLoader.loadFilePromise(_mediaPromise);
_mediaLoader.contentLoaderInfo.addEventListener(starling.events.Event.COMPLETE, onLoadImageComplete);
private function onLoadImageComplete(event:flash.events.Event=null):void {
    //creating the starling texture to display the image inside the application
    var texture:Texture = Texture.fromBitmapData(Bitmap(_mediaLoader.content).bitmapData, false, false, 1);
    //now trying to load the content into a bytearray to send to the server later
    var bytes:ByteArray=_mediaLoader.contentLoaderInfo.bytes;
}

the last line of code results in a Security error: Error #2044: Unhandled SecurityErrorEvent:. text=Error #2121: Security sandbox violation: app:/myapp.swf: http://adobe.com/apollo/[[DYNAMIC]]/1 cannot access . This may be worked around by calling Security.allowDomain.

I tried

Security.allowDomain("*") 

as a test but then i get: SecurityError: Error #3207: Application-sandbox content cannot access this feature.

As a workaround i write my own png ByteArray inside the Application from the loaders BitmapData using Adobes PNGEncoder Class:

var ba:ByteArray=PNGEncoder.encode(Bitmap(_mediaLoader.content).bitmapData)

But this takes a significant amount of time ...

I also tried the FileReference to load the image but

_mediaPromise.file 

and

_mediaPromise.relativePath 

are both null.

What am I doing wrong? Or is this a known problem ?

Thanks!


Solution

  • Hello I have found a solution based on a post about the processing of exif data mentioned here: http://blogs.adobe.com/cantrell/archives/2011/10/parsing-exif-data-from-images-on-mobile-devices.html

    the crucial code

    private function handleMedia(event:MediaEvent):void{
    
        _mediaPromise=event.data as MediaPromise;
        _imageBytes=new ByteArray()
        var mediaDispatcher:IEventDispatcher = _mediaPromise.open() as IEventDispatcher;
        mediaDispatcher.addEventListener(ProgressEvent.PROGRESS, onMediaPromiseProgress);
        mediaDispatcher.addEventListener(flash.events.Event.COMPLETE, onMediaPromiseComplete);
    };
    private function onMediaPromiseProgress(e:ProgressEvent):void{
        var input:IDataInput = e.target as IDataInput;
        input.readBytes(_imageBytes, _imageBytes.length, input.bytesAvailable);
    };
    private function onMediaPromiseComplete(e:flash.events.Event):void{
        _mediaLoader = new Loader();
        _mediaLoader.loadBytes(_imageBytes)
    
    };
    

    works like a charm for me on ipad and iphone.