尝试从 mediaPromise 加载 ByteArray 时出现安全错误

Security Error when trying to load ByteArray from mediaPromise

在移动应用程序中,我需要发送用户用相机拍摄或从相机胶卷中挑选的图像。 我正在使用 starling 框架和 feathersUI(虽然我认为这无关紧要) 当使用 loadFilePromise 加载 mediapromise 时,我使用以下代码处理图像数据:

_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;
}

最后一行代码导致安全错误: 错误 #2044:未处理的 SecurityErrorEvent:。 text=Error #2121:违反安全沙箱:app:/myapp.swf: http://adobe.com/apollo/[[DYNAMIC]]/1 无法访问 .这可以通过调用 Security.allowDomain.

来解决

我试过了

Security.allowDomain("*") 

作为测试 但后来我得到: SecurityError:错误 #3207:应用程序沙盒内容无法访问此功能。

作为解决方法,我使用 Adob​​es PNGEncoder Class:

在加载器 BitmapData 的应用程序中编写了自己的 png ByteArray
var ba:ByteArray=PNGEncoder.encode(Bitmap(_mediaLoader.content).bitmapData)

但这需要很长时间...

我也试过 FileReference 来加载图像,但是

_mediaPromise.file 

_mediaPromise.relativePath 

均为空。

我做错了什么?或者这是一个已知问题?

谢谢!

您好,我找到了一个基于 post 的解决方案,关于这里提到的 exif 数据的处理:http://blogs.adobe.com/cantrell/archives/2011/10/parsing-exif-data-from-images-on-mobile-devices.html

关键代码

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)

};

在 ipad 和 iphone 上对我来说就像一个魅力。