在Flex中获取Google地图的屏幕截图(安全错误解决方法)

时间:2011-08-05 14:39:16

标签: security google-maps flex

我的flex应用中有一张谷歌地图,偶尔我需要导出到图像文件。每次我尝试调用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");

......并没有什么区别。

我最大的问题是:为什么该应用程序试图访问远程文件? 我要求在客户端屏幕上绘制的组件的位图表示。显然,提供该位图所需的所有信息都已存在于本地存储器中。

无论如何,有没有人为此找到解决方法?

我正在使用Google Maps for Flex版本1.20。

这是一些示例代码,应该重现我得到的错误。注意:它需要安装Google Maps for 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 个答案:

答案 0 :(得分:2)

我已经经历了同样的问题一段时间,然后找出原因。

Flash具有严格的“跨域限制”。由于某种原因,您无法访问我们域外的资源{.swf,images / .png ..,}。说你可以通过将资源加载到LOADER来查看资源,但不要提取它们。

解决此问题的方法是通过 PHP代理脚本来提取这些资源。

我可以看到很多问题。下面的链接帮助我解决了这个问题,希望它也适合你。

如何使用代理从其他域导入资源 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/

答案 1 :(得分:0)

尝试将加载的内容作为sourceContent设置为“true”的Image的源,然后获取它的ImageSnapshot。这将强制专门针对该图像的内容读取策略文件。

HTH;

艾米

答案 2 :(得分:0)

为什么不尝试将地图本身绘制到BitmapData中?

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

我不确定为什么你会收到安全沙箱违规行为,除非你做了一些时髦的事情。你是在本地运行文件吗?您是否尝试过使用Web服务器?

答案 3 :(得分:0)

谷歌的回答是,'使用Flex 3 SDK,而不是Flex 4.“非常感谢Google。

答案 4 :(得分:0)

你可以使用:

var bitmap:Bitmap = googleMap.getPrintableBitmap();