3

我正在使用 Adob​​e AIR 为我的 Android 手机制作 APK 文件。在 APK 包内有一个 SWF 文件,在与 SWF 文件相同的文件夹中,有一个名为“images”的子文件夹,其中包含 image.jpg。

我试图在运行时将该 image.jpg 读入程序但无法获取它的位置(程序似乎找不到它。

这是我正在尝试的:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("images/image.jpg"));
while (bitmapData==null) {}  //wait until loaded
return bitmapData;

onComplete 函数 puts 设置 bitmapData 字段。但是,COMPLETE 事件永远不会发生,因此 while 循环永远不会存在。

我也试过:

loader.load(new URLRequest("/images/image.jpg"));
loader.load(new URLRequest("app:/images/image.jpg"));
loader.load(new URLRequest("app-storage:/images/image.jpg"));
loader.load(new URLRequest("file:/images/image.jpg"));

它都不起作用。

即使在没有 APK 文件的情况下尝试仅运行生成的 SWF 文件(图像子文件夹与 SWF 文件位于同一文件夹中)时,我也无法使其工作。

我无法将 JPG 嵌入 SWF 文件本身,因为我需要有很多图像文件,而且在制作如此大的 SWF 文件时,Flash CS6 会耗尽内存(从外部读取图像也意味着编译时间要少得多)。

有任何想法吗?如何将外部 JPG 文件放入 BitmapData?请记住,图像不在 APK 文件之外,而是打包在其中。

注意:我稍后也会将这个东西导出到一个 iOS ipa 包中,所以它也必须在那里工作。


编辑,因为由于我的声誉,我无法自我回答。

Strille 让我意识到 ActionScript 虚拟机是单线程的。

因此,不可能让线程休眠(等待)以加载正在加载的图像。相反,我不得不叹息重写很多代码,以便在调用 onComplete 函数时停止并继续。

我之前尝试过的这件事实际上可以工作,但由于 while 循环而无法完成:

loader.load(new URLRequest("app:/images/image.jpg"));
4

2 回答 2

1

如果我没记错的话,你应该可以这样做:

loader.load(new URLRequest(new File("app:/images/image.jpg").url));

由于我们使用的是 File 类,因此上述内容不会在 Flash Player 中运行,只能在 iOS 或 Android 上运行。

于 2012-10-20T20:01:30.607 回答
0

根据我的经验,有两种实用的方法可以使用 AIR 从正在运行的 Android APP 加载资产

  1. 使用 File 实例的 URLLoader 和 .url 属性
  2. 使用 FileStream (接收 File 实例)

添加到项目

您可以在应用程序的 .xml 描述符文件中使用与打包 ICONS 相同的技术将文件打包到 APK 中。

并确保将它们添加到您的 IDE 中的 Android 部分(适用于 IntelliJ 和 Flash Builder)“要打包的文件和文件夹” - 将路径添加到您想要的资产文件夹,并为其指定一个相对名称别名。

细化

资产本身被放置(当安装 APP 时),在AIR 可用的 '' applicationDirectory '' 内,

然而,由于较新的 Android 操作系统和 Flash 播放器存在安全问题,因此无法通过nativePath访问这些资产,只能通过File实例的“ url ”属性访问这些资产。

最佳实践

使用 File 实例的 URLLoader 和 .url 属性,因为它本质上也是异步的,并且可以使用本机解码器解析 PNG / JPG 文件,而不必手动读取FileStream(返回 aa ByteArray

var f:File = File.applicationDirectory.resolvePath('images/myimage.png');
loader.load(new URLRequest(f.url));

并且,如果我错过了更多方法,请告诉...)

于 2016-11-06T13:39:06.417 回答