我的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>
答案 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();