我有一个谷歌地图在我的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();