ApplicationStorageDirectory中的Air app swf资产会产生Sandbox Violation

时间:2009-10-21 18:59:51

标签: flex security air

我有一个Air应用程序,允许用户导入jpg,png和swf文件,并将它们用作图像的源,它们可以在Canvas中拖动。

导入功能将所选文件复制到ApplicationStorageDirectory中的 images 目录。

当我点击以swf为源的图片时,我收到安全沙箱违规(例如,SecurityDomain'app-storage:/ Project1/images/menuBarBkgd.swf'试图访问不兼容的上下文'app:/的main.swf“)。我的mouseDown处理程序没有被调用,因此我无法选择它并允许它被拖动。

显然这与app:domain有关,但我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

为什么不使用mouseChildren = false来阻止鼠标访问图像呢?属于AIR应用程序的Sprite可以显示图像,并处理传入的MouseEvents本身。或者,您可以从加载的图像中读取BitmapData,并使用它来填充AIR应用程序本机的新Bitmap实例。

答案 1 :(得分:0)

在Adobe Air中,以下应用程序域仅允许以“app:/”开头的URL:

       
  1. ApplicationDomain.currentDomain
  2.    
  3. new ApplicationDomain(ApplicationDomain.currentDomain)
  4.    
  5. new ApplicationDomain(domain),其中domain是这三种类型中的任何一种。

您可以通过构建一个无法直接或间接访问ApplicationDomain.currentDomain的独立应用程序域,从另一个URL将SWF加载到Adobe Air应用程序中。您可以将null传递给ApplicationDomain的构造函数。

换句话说,使用new ApplicationDomain()作为应用程序域。

答案 2 :(得分:0)

之前发布的答案不是原始问题的解决方案。 这里的问题是SecurityDomain,而不是ApplicationDomain。我认为有一种方法可以在Air应用程序中使用app:/ domain外部的swf文件,但文档在这个问题上远非直接,最终解决方案可能需要最终用户的一些干预。

我只是想创建一个简单的所见即所得页面编辑器,并允许用户将创建为swf文件的图像用作mx:Image组件的源。那很有效!您可以使用app:/ domain外部的swf文件作为mx:Image的源。但是,如果要在屏幕上拖动它,只要单击它就会导致Sandbox违规,并且启动拖动的mousedown事件会被中断。似乎即使swf文件中没有脚本,如果任何资产已经变成了movieClip(我们在这里谈论Flash),那么只要你点击它们就会尝试引用父swf。 Air应用程序将此解释为外部swf尝试编写脚本并发生Sandbox违规。

解决这个特定问题的方法是将mx:Image放在mx:Canvas中,并将Canvas的mouseChildren属性设置为false。

答案 3 :(得分:0)

拖动操作通常涉及访问属于父沙箱的阶段。

你有几个选择 - 一个是简单地忽略/捕获错误,如果它实际上没有影响编译的Air应用程序中的功能,这不会在这种错误上停止运行(通常不)。

另一种选择是重构功能,使其不访问舞台。这很难做到,因为似乎有一些鼠标事件试图让阶段坐标填充其属性。我经常看到这个错误,通常不会妨碍你。