AIR安卓应用中File对象的nativePath属性为空是什么原因?
AIR安卓应用打包资源nativePath为空问题解决方案
问题复现
已知includes/audio/bird.mp3已打包进APK,测试代码如下:
var file:File = File.applicationDirectory.resolvePath("includes/audio/bird.mp3"); trace("file",file.exists); trace("file",file.nativePath); trace("file",file.url);
输出结果:
file true file file app:/includes/audio/bird.mp3
根因说明
该现象属于安卓平台AIR运行时的正常设计,并非程序异常:
- AIR的
applicationDirectory指向APK安装包内部的资源压缩区域,该区域的文件没有映射到安卓系统文件系统的独立实体路径,因此nativePath属性返回空 exists返回true是因为AIR内部虚拟文件系统可识别app:/协议的内部路径,可正常判断资源是否存在url返回的app:/开头路径为AIR内部可用的虚拟路径,仅限AIR内置API使用
解决方案
场景1:使用AIR内置API处理资源
直接使用File对象的url属性即可完成资源加载、读取等操作,无需获取原生路径。以音频播放为例:
var sound:Sound = new Sound(); sound.load(new URLRequest(file.url)); sound.play();
场景2:需调用安卓原生API/ANE扩展
如果业务逻辑必须依赖系统可识别的原生路径,需先将APK内部资源拷贝到应用可写目录,拷贝后的文件即可正常获取nativePath:
// 源文件:APK内部打包的资源 var source:File = File.applicationDirectory.resolvePath("includes/audio/bird.mp3"); // 目标路径:应用私有存储目录(安卓系统可识别) var target:File = File.applicationStorageDirectory.resolvePath("audio/bird.mp3"); // 避免重复拷贝 if(!target.exists) { // 若目标目录不存在先创建 target.parent.createDirectory(); source.copyTo(target); } // 输出拷贝后文件的原生路径 trace("可用原生路径:", target.nativePath);
内容的提问来源于stack exchange,提问作者crooksy88
相关产品推荐
相关产品推荐

