Ошибка безопасности при попытке загрузить 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.

Другие вопросы по тегам