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

Expo 50 Android生产环境中如何对打包的PNG资源进行Base64编码

Expo 50 Android生产环境中如何对打包的PNG资源进行Base64编码

我完全理解你折腾这么久的烦躁——开发环境好好的,一打包APK就掉链子,这种问题最磨人了。咱们一步步来解决这个问题:

首先,你提到不能用SDK51的Asset API,但其实Expo 50依然可以用旧版的expo-asset库来处理打包资源,这是关键。另外,Expo打包Android APK时,静态资源并不是以普通文件的形式存在(这也是你解压APK找不到图片的原因,它们被编译进了asset bundles里),所以直接用file://前缀肯定行不通。

下面是经过验证的解决方案:

步骤1:确保依赖安装正确

如果还没装expo-asset,先执行安装:

npx expo install expo-asset

步骤2:正确加载资源并转换为Base64

我们需要先通过expo-asset加载资源,确保它在生产环境中能被正确定位,再用expo-file-system读取为Base64编码:

import { Asset } from 'expo-asset';
import * as FileSystem from 'expo-file-system';

// 封装成异步函数方便调用
async function convertImageToBase64() {
  try {
    // 1. 通过require引入你的图片资源,注意路径要正确
    const imageModule = require('./assets/your-target-image.png');
    // 2. 将模块转换为Asset实例
    const imageAsset = Asset.fromModule(imageModule);
    // 3. 等待资源加载完成(生产环境中这一步会确保资源被正确定位)
    await imageAsset.loadAsync();

    // 4. 获取生产环境可用的URI,Android下这个URI应该是`asset://`开头的,不用额外加前缀
    const assetUri = imageAsset.localUri;

    // 5. 读取资源并转换为Base64
    const base64Data = await FileSystem.readAsStringAsync(assetUri, {
      encoding: FileSystem.EncodingType.Base64,
    });

    // 拿到Base64后就可以用来生成PDF了
    return base64Data;
  } catch (error) {
    console.error('转换Base64失败:', error);
    // 可以在这里做错误处理,比如提示用户
    throw error;
  }
}

关键注意事项

  • 资源必须被Expo打包识别:确保你的图片路径被添加到app.json的assets数组中,比如:
    {
      "expo": {
        "assets": ["./assets/images/"] // 把你的图片所在目录加进去
      }
    }
    
    这样Expo打包时才会把这些资源包含到APK里。
  • 不要手动修改URI前缀:imageAsset.localUri已经是生产环境可用的正确路径,手动加file:///或file:///android_asset反而会导致FileSystem找不到资源。
  • 路径不要写错:开发时metro可能会宽容一些路径错误,但打包时必须保证require的路径完全正确,建议用相对路径,避免绝对路径。

如果还是不行,可以先打印imageAsset.localUri看看生产环境下的实际值,确认它是asset://开头的,然后用FileSystem.getInfoAsync(assetUri)检查资源是否存在,这样能快速定位问题出在资源加载还是读取环节。

备注:内容来源于stack exchange,提问作者Danny_P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 10:28:01