加载和播放声音时的安全注意事项

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

可以根据 Flash Player 或 AIR 安全模型来限制应用程序访问声音数据的能力。每种声音受两种不同的安全沙箱的限制:内容本身的沙箱(“内容沙箱”)以及加载和播放声音的应用程序或对象的沙箱(“所有者沙箱”)。对于应用程序安全沙箱中的 AIR 应用程序内容,应用程序安全沙箱中的内容可以访问所有声音(包括从其他域加载的声音)。但是,其他安全沙箱中的内容与在 Flash Player 中运行的内容遵守相同的规则。有关 Flash Player 安全模型概述的详细信息以及沙箱定义,请参阅 安全性

内容沙箱控制使用 id3 属性还是 SoundMixer.computeSpectrum() 方法从声音提取详细声音数据。它不会限制声音文件本身的加载或播放。

声音文件的原始域定义了内容沙箱的安全限制。一般来说,如果某个声音文件与加载该文件的应用程序或对象的 SWF 文件位于相同的域或文件夹中,则应用程序或对象具有该声音文件的完全访问权限。如果声音来自不同于应用程序所在域的域,仍可以使用策略文件将其加载到内容沙箱中。

应用程序可以将带有 checkPolicyFile 属性的 SoundLoaderContext 对象作为参数传递给 Sound.load() 方法。如果将 checkPolicyFile 属性设置为 true ,则会通知 Flash Player 或 AIR 在从中加载声音的服务器上查找策略文件。如果存在策略文件,并且它为执行加载的 SWF 文件所在的域授予了访问权限,则该 SWF 文件可以加载声音文件,访问 Sound 对象的 id3 属性以及为加载的声音调用 SoundMixer.computeSpectrum() 方法。

所有者沙箱控制声音的本地播放。所有者沙箱是由开始播放声音的应用程序或对象定义的。

只要当前播放的所有 SoundChannel 对象中的声音符合以下条件, SoundMixer.stopAll() 方法就会将它们静音:

  • 声音是由相同所有者沙箱中的对象启动的。

  • 声音来自具有某一策略文件的源,该策略文件为调用 SoundMixer.stopAll() 方法的应用程序或对象所在的域授予访问权限。

但在 AIR 应用程序中,应用程序安全沙箱中的内容(随 AIR 应用程序安装的内容)不受这些安全限制的约束。

要查明 SoundMixer.stopAll() 方法是否确实停止了所有播放的声音,应用程序可以调用 SoundMixer.areSoundsInaccessible() 方法。如果该方法返回值 true ,则当前所有者沙箱无法控制播放的某些声音, SoundMixer.stopAll() 方法不会将其停止。

SoundMixer.stopAll() 方法还会阻止播放头继续播放从外部文件加载的所有声音。但是,如果动画移动到一个新帧,FLA 文件中嵌入的声音以及使用 Flash 创作工具附加到时间轴中的帧上的声音可能会重新开始播放。