2009-09-08 58 views
0

当安全性违规下面的代码被简化例如AIR:使用远程图像

我开发AIR应用程序(使用Flex),其装载它的几个图像的从远程web服务器。这些图像显示效果细腻,但是,每当我在操纵其持有的远程加载的图像的容器,我得到的错误在我的控制台:

*** Security Sandbox Violation *** 
SecurityDomain 'http://www.google.com/intl/en_ALL/images/logo.gif' tried to access incompatible context 'app:/sandbox_test.swf' 

的图像似乎并没有受到影响,但我不t喜欢显示错误,我不明白。下面是举例说明该问题的示例应用程序:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication width="500" height="500" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:HDividedBox width="100%" height="300" horizontalCenter="0" verticalCenter="0" backgroundColor="#000000" liveDragging="true"> 
     <mx:Image source="http://sstatic.net/so/img/logo.png"/> 
     <mx:Image source="http://www.google.com/intl/en_ALL/images/logo.gif"/> 
    </mx:HDividedBox> 
</mx:WindowedApplication> 

如果您将使用上的HDividedBox牵引机,会出现安全错误。

我已经看了一些安全类/安全沙箱中的东西为空,但默认情况下AIR应有权访问网络资源(这就是为什么图像加载我认为)。在AIR中使用Security.allowDomain(“www.google.com”)不是一个选项 - 它只是抛出SecurityError。

有谁知道是什么原因引起的,或如何解决呢? (或者也许它只是一个Flex/AIR错误?)。

而且 - 没有人知道是否有当错误发生破裂的一种方式,这样我就可以究根行动造成的呢?

+0

Ha是否使用调试器来确定安全错误何时实际发生?在绘画阶段? – ryanstewart

+0

当错误触发时,调试器实际上不会中断,它们只是打印到控制台。目前还不清楚我如何追踪他们的来源 –

回答

0

做这个图像显示,当你不是在调试运行?问题是该域没有crossdomain.xml文件设置以允许Flash中的图像。

http://www.google.com/crossdomain.xml

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <site-control permitted-cross-domain-policies="by-content-type" /> 
</cross-domain-policy> 

你或许应该只抓的图像并将其放置在你的应用程序的资产,或者在一个域你控制,可以适当加的crossdomain.xml将允许内容。 Security.allowDomain不会有你正在寻找的影响。 This article对我已阅读的跨域安全性有最好的解释。下面

见ryanstewart的评论。以上是AIR应用程序的hogwash。

+1

这与AIR无关。当你在桌面上时,你正在遵循一组不同的规则。 @Chris,你的应用叫做sandbox_test?这就是为什么app:/sandbox_test.swf文件被引用? – ryanstewart

+0

噢,真的,抱歉的错误信息。 –

+0

是的 - 我制作的测试应用程序名为sandbox_test,只是为了确保问题不会与我的真实应用程序混淆。 –

3

此安全沙箱问题特定于拖动其中包含图像组件的UIComponent。图像组件引用外部图像。我到处看着,每遇到线程结尾都没有答案,这通常意味着它是一个错误。

我的盗版解决方法吗?图像下载到Image组件后,将其缓存为位图并将Image组件源重新分配给Bitmap。这解决了该问题对我来说:

private function authorImageLoadComplete(event:Event):void { 
    var bp:Bitmap = dupeImage(authorImage); 
    authorImage.source=bp; 

} 

private function dupeImage(source:Image):Bitmap { 
    var data:BitmapData = Bitmap(source.content).bitmapData; 
    var bitmap:Bitmap = new Bitmap(data); 
    return bitmap; 
} 

然后在你的UIComponent你的形象标签:

<mx:Image id="authorImage" complete="authorImageLoadComplete(event)"></mx:Image> 

运气最好的球员