Firemonkey安卓应用资源找不到求助:Windows正常安卓异常
这个问题主要源于Windows和Android的资源存储机制差异,以及Android平台的大小写敏感性,具体原因和解决方案如下:
核心原因
资源存储方式不同
Windows平台下,你添加的资源会被嵌入到PE(可执行文件)的资源段中,HInstance指向程序实例,RT_RCDATA是Windows标准资源类型,所以TResourceStream能正常读取。
但Android平台下,项目中的资源会被打包到APK的assets目录中,而非PE资源段。HInstance在Android上的含义和Windows完全不同,基于它的TResourceStream构造函数无法识别APK里的assets资源,自然找不到。大小写敏感问题
Windows的资源系统不区分大小写,但Android的文件系统和资源系统严格区分。如果代码中写的资源名(比如"String_ressource")和实际添加的资源名大小写不一致,Android就会找不到资源,而Windows能正常识别。
解决方案
1. 针对Android平台使用专门的资源加载方式
FireMonkey提供了TAssetManager类来访问Android的assets资源,你需要针对不同平台做条件编译:
uses System.SysUtils, System.Classes, {$IFDEF ANDROID} Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.Helpers; {$ENDIF} function GetResourceStream(const ResourceName: string): TStream; begin {$IFDEF MSWINDOWS} // Windows平台继续使用原方式 Result := TResourceStream.Create(HInstance, ResourceName, RT_RCDATA); {$ENDIF} {$IFDEF ANDROID} // Android平台通过AssetManager访问assets资源 var AssetManager := TAndroidHelper.Context.getAssets; Result := TAssetStream.Create(AssetManager.Open(StringToJString(ResourceName))); {$ENDIF} end;
2. 确保资源的Deployment设置正确
打开Project -> Deployment,检查你的资源文件:
- 确认资源文件已被添加到Deployment列表中
- 把
Remote Path设置为assets\(这样资源会被打包到APK的assets目录下) - 确保
Platform列包含Android平台
3. 严格匹配资源名的大小写
检查代码中的资源名和Project -> Resources and images中的资源名完全一致(包括大小写),比如代码里用"String_ressource",资源列表里的Resource Name也要完全一样,不能写成"string_ressource"或"String_Ressource"。
内容的提问来源于stack exchange,提问作者macTAR

