Получение скриншота карты Google во Flex (обходной путь безопасности) - PullRequest
1 голос
/ 05 августа 2011

В моем приложении 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>

Ответы [ 5 ]

2 голосов
/ 06 сентября 2012

Я прошел через ту же проблему в течение некоторого времени, а затем выяснил причину.

Flash имеет строгое « междоменное ограничение ».Вы не можете получить доступ к ресурсам за пределами нашего домена по некоторым причинам {например: .swf, images / .png ..,}.Скажем, вы можете просматривать ресурсы, загружая их в ПОГРУЗЧИК, но не извлекать их.

Обходной путь для этого состоит в том, чтобы использовать эти ресурсы с помощью PHP Proxy-скрипта .

Я вижу много вопросов, возникающих у вас.Ссылки ниже помогли мне решить эту проблему, надеюсь, это поможет и вам.

Как использовать прокси для импорта ресурсов из других доменов http://active.tutsplus.com/tutorials/actionscript/quick-tip-using-a-php-proxy-to-load-assets-into-flash/

Трюк с прокси для .swf s http://jorgealbaladejo.com/2010/09/06/actionscript-and-cross-domain-problem/

0 голосов
/ 27 мая 2013

Вы можете просто использовать:

var bitmap:Bitmap = googleMap.getPrintableBitmap();
0 голосов
/ 08 августа 2011

Почему бы вам просто не попытаться нарисовать саму карту в BitmapData?

var bitmap:BitmapData = new BitmapData(gMap.width, gMap.height);
bitmap.draw(gMap);

Я не уверен, почему вы получаете нарушение песочницы безопасности, если вы не делаете что-то напуганное. Вы запускаете файл локально? Вы пытались использовать его с веб-сервера?

0 голосов
/ 11 августа 2011

Ответ Google: «Используйте Flex 3 SDK, а не Flex 4.» Большое спасибо, Google.

0 голосов
/ 05 августа 2011

Попробуйте передать загруженный контент в качестве источника для Image, для которого trustContent имеет значение "true", а затем получите ImageSnapshot этого. Это заставит файл политики быть прочитанным специально для содержимого этого образа.

НТН;

Amy

...