如何在Android端正确使用Tauri资源文件?字体访问失败求助
问题
使用Tauri开发Android应用时,访问字体资源文件触发NotFound错误,相同代码在Windows端运行正常。已完成以下配置与操作:
- 在
src-tauri目录下创建fonts文件夹并放入目标字体文件 - 在
tauri.conf.json中配置"bundle": {"resources": ["fonts/*"]} - 确认
target/debug目录下已生成fonts文件夹及对应字体文件
使用的Rust代码:
let resource_path = app_handle .path() .resolve(format!("fonts/{}", name), BaseDirectory::Resource) .expect("failed to resolve resource"); let mut file = File::open(&resource_path).expect(&format!("Failed to open font file {}", resource_path.as_path().to_str().unwrap()));
报错信息:
10-19 16:22:58.189 19486 19600 I RustStdoutStderr: thread '<unnamed>' panicked at src\lib.rs:85:47: 10-19 16:22:58.189 19486 19600 I RustStdoutStderr: Failed to open font file asset://localhost/fonts/Calibri-Regular.ttf: Os { code: 2, kind: NotFound, message: "No such file or directory" }
解决方法
Android平台上,Tauri的资源会被打包到APK的assets目录中,无法通过常规文件系统路径用File::open直接访问,需改用Tauri提供的资源读取API处理:
1. 替换文件读取逻辑
使用app_handle.asset().read()方法直接读取资源内容,替代File::open:
use tauri::api::asset::Asset; // 拼接资源路径 let resource_path = format!("fonts/{}", name); // 读取APK内的资源内容 let asset_content = app_handle .asset() .read(&resource_path) .expect(&format!("Failed to read font asset: {}", resource_path)); // 示例:将读取到的内容转为Vec<u8>用于加载字体 // let font_data = asset_content.to_vec(); // let font = Font::try_from_vec(font_data)?;
2. 验证权限配置
确保tauri.conf.json的allowlist中启用了asset相关权限(默认已启用,若手动修改过需检查):
"allowlist": { "asset": { "all": true } }
3. 重新构建应用
执行以下命令重新构建Android版本,确保资源正确打包到APK:
cargo tauri build --target aarch64-linux-android
核心原因
Android的APK是压缩包结构,内部资源没有对应的真实文件系统路径,BaseDirectory::Resource解析出的asset://是Tauri的虚拟资源路径,并非系统可识别的文件路径,因此File::open会触发找不到文件的错误,而assetAPI会专门处理APK内资源的读取逻辑。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

