You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:04:58