Ошибка безопасности при попытке загрузить ByteArray из mediaPromise
В мобильном приложении мне нужно отправить изображение, которое пользователь либо снимал с камеры, либо снимал с камеры. Я использую инфраструктуру starling и feathersUI (хотя я думаю, что это не имеет значения для проблемы). Когда mediapromise загружается с помощью loadFilePromise, я использую следующий код для работы с данными изображения:
_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= Ошибка #2121: Нарушение изолированной программной среды безопасности: приложение: /myapp.swf: http://adobe.com/apollo/[[DYNAMIC]]/1 не может получить доступ. Это можно обойти, вызвав Security.allowDomain.
Я старался
Security.allowDomain("*")
в качестве теста, но затем я получаю: SecurityError: Ошибка #3207: содержимое песочницы приложения не может получить доступ к этой функции.
В качестве обходного пути я пишу свой собственный png ByteArray внутри приложения из загрузчиков BitmapData, используя класс Adobes PNGEncoder:
var ba:ByteArray=PNGEncoder.encode(Bitmap(_mediaLoader.content).bitmapData)
Но это занимает значительное количество времени...
Я также попытался FileReference, чтобы загрузить изображение, но
_mediaPromise.file
а также
_mediaPromise.relativePath
оба нулевые.
Что я делаю неправильно? Или это известная проблема?
Спасибо!
1 ответ
Здравствуйте, я нашел решение, основанное на посте об обработке 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.