尝试从 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:应用程序沙盒内容无法访问此功能。
作为解决方法,我使用 Adobes 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 上对我来说就像一个魅力。
在移动应用程序中,我需要发送用户用相机拍摄或从相机胶卷中挑选的图像。 我正在使用 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:应用程序沙盒内容无法访问此功能。
作为解决方法,我使用 Adobes PNGEncoder Class:
在加载器 BitmapData 的应用程序中编写了自己的 png ByteArrayvar 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 上对我来说就像一个魅力。