В моем приложении Flex есть карта Google, которую необходимо периодически экспортировать в файл изображения. Каждый раз, когда я пытаюсь вызвать функции Map.getPrintableBitmap () или ImageSnapshot.captureBitmapData (), я получаю сообщение об ошибке # 2123: нарушение изолированной программной среды безопасности.
Я пытался добавить различные разрешения безопасности, такие как:
Security.allowDomain("*.google.com");
Security.allowDomain("*.googleapis.com");
и заставляет приложение читать междоменный домен Google:
Security.loadPolicyFile("http://mt0.google.com/crossdomain.xml");
Security.loadPolicyFile("http://mt1.google.com/crossdomain.xml");
Security.loadPolicyFile("http://maps.google.com/crossdomain.xml");
Security.loadPolicyFile("http://maps.googleapis.com/crossdomain.xml");
... и это не имеет значения.
Мой самый большой вопрос: ПОЧЕМУ ПРИЛОЖЕНИЕ пытается получить доступ к удаленному файлу вообще ??
Я прошу растровое представление компонента, который уже нарисован на экране клиента. Очевидно, что вся информация, необходимая для предоставления этого растрового изображения, уже присутствует в локальной памяти.
В любом случае, кто-нибудь нашел обходной путь для этого?
Я использую версию 1.20 Google Maps для Flex.
Вот пример кода, который должен воспроизвести ошибку, которую я получаю. Примечание: для этого требуется установить библиотеку Google Maps для Flex
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
initialize="initComp()">
<mx:Canvas id="mapContainer" x="100" y="100" width="980" height="620" >
</mx:Canvas>
<mx:Button label="Try Export" click="exportMap()" />
<fx:Script><![CDATA[
import com.google.maps.Map;
import mx.graphics.codec.PNGEncoder;
private var gMap:Map;
private function initComp():void{
gMap = new Map();
gMap.sensor = "false";
Security.allowInsecureDomain("*.google.com");
Security.allowInsecureDomain("*.googleapis.com");
//local debug
gMap.key = //"[API KEY]";
gMap.width = 980;
gMap.height = 620;
mapContainer.addChild(gMap);
}
public function exportMap():void{
/*Security.loadPolicyFile("http://mt0.google.com/crossdomain.xml");
Security.loadPolicyFile("http://mt1.google.com/crossdomain.xml");
Security.loadPolicyFile("http://maps.google.com/crossdomain.xml");
Security.loadPolicyFile("http://maps.googleapis.com/crossdomain.xml");*/
//var snapshot:BitmapData = ImageSnapshot.captureBitmapData(mapComponent);
var snapshot:BitmapData = gMap.getPrintableBitmap().bitmapData;
var encoder:PNGEncoder = new PNGEncoder();
var pngData:ByteArray = encoder.encode(snapshot);
var ref:FileReference = new FileReference();
//ref.addEventListener(IOErrorEvent.IO_ERROR, onFileSaveError);
ref.save(pngData, "OneView-Map.png");
}
]]></fx:Script>
</s:Application>