在Flex中获取谷歌地图的截图(安全错误解决方案)



我有一个谷歌地图在我的flex应用程序,我需要偶尔导出到一个图像文件。每次我尝试调用Map.getPrintableBitmap()或imagessnapshot . capturebitmapdata()函数时,我得到错误#2123:安全沙箱违规。

我试过添加各种安全允许,如:

Security.allowDomain("*.google.com"); 
Security.allowDomain("*.googleapis.com"); 

和强制应用程序读取谷歌的跨域:

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 for Flex。

这里有一些示例代码,应该重现我得到的错误。注意:它需要安装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>

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

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/

尝试将加载的内容作为源图像,trustContent设置为"true",然后获得该图像的ImageSnapshot。这将强制为该图像的内容专门读取策略文件。

HTH;艾米

为什么不尝试将地图本身绘制成BitmapData呢?

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

我不知道为什么你得到一个安全沙箱违规,除非你做一些时髦的事情。您是否在本地运行该文件?你试过在网络服务器上使用它吗?

谷歌的回答是:"使用Flex 3 SDK,而不是Flex 4。"非常感谢谷歌。

你可以直接使用:

var bitmap:Bitmap = googleMap.getPrintableBitmap();

相关内容

最新更新