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

Android库中JSON文件的正确使用及无Asset目录时的读写方案

在Android Library中使用JSON文件的正确姿势

刚好我之前做过类似的Android Library开发,针对你的需求——把JSON命令从代码中抽离出来,同时解决没有asset目录的问题,给你整理两套最常用的方案,都是Android Library中访问静态资源的标准做法:

方案一:用res/raw目录(更推荐,避免资源冲突)

这是Library中存放静态配置文件最稳妥的方式,因为raw资源会生成唯一的资源ID,不会和宿主App或其他Library的资源冲突:

  1. 创建目录并存放JSON
    在你的Library模块的src/main/res目录下新建raw文件夹(如果还没有的话),把你的JSON命令文件放进去,比如命名为commands.json。注意文件名只能用小写字母、数字、下划线或点,不能有大写或特殊字符。

  2. 读取JSON内容
    因为Library本身没有独立的Context,需要传入宿主App的Context来访问资源。写一个工具方法来读取:

    // Kotlin示例
    fun loadCommandsJson(context: Context): String {
        return try {
            // 通过资源ID打开输入流
            val inputStream = context.resources.openRawResource(R.raw.commands)
            val buffer = ByteArray(inputStream.available())
            inputStream.read(buffer)
            inputStream.close()
            String(buffer, Charsets.UTF_8)
        } catch (e: IOException) {
            e.printStackTrace()
            "" // 读取失败时返回空字符串或自定义默认值
        }
    }
    
    // Java示例
    public static String loadCommandsJson(Context context) {
        try {
            InputStream inputStream = context.getResources().openRawResource(R.raw.commands);
            int size = inputStream.available();
            byte[] buffer = new byte[size];
            inputStream.read(buffer);
            inputStream.close();
            return new String(buffer, StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
    

方案二:用assets目录(适合需要动态文件名的场景)

如果你更习惯用asset目录,也可以在Library中创建:

  1. 创建目录并存放JSON
    在Library模块的src/main目录下新建assets文件夹,把JSON文件放进去,比如commands.json。

  2. 读取JSON内容
    同样需要宿主App的Context来访问assets:

    fun loadCommandsJsonFromAssets(context: Context): String {
        return try {
            val inputStream = context.assets.open("commands.json")
            val reader = BufferedReader(InputStreamReader(inputStream))
            val stringBuilder = StringBuilder()
            var line: String?
            while (reader.readLine().also { line = it } != null) {
                stringBuilder.append(line)
            }
            reader.close()
            inputStream.close()
            stringBuilder.toString()
        } catch (e: IOException) {
            e.printStackTrace()
            ""
        }
    }
    

注意事项

  • 资源打包确认:Library的build.gradle默认会包含res和assets目录的资源,不用额外配置;如果有自定义sourceSets,要确保这些目录被正确包含。
  • 避免资源冲突:如果用assets目录,要注意文件名不能和宿主App或其他依赖Library的assets文件重名,否则会被覆盖;而raw资源因为有唯一的R类ID,完全不用担心这个问题,所以更推荐方案一。
  • Context的传递:Library无法直接获取Context,必须由宿主App在调用时传入,比如loadCommandsJson(appContext)。

你提到的“在Android Library中访问资源”确实是解决这个问题的核心方向,上面的两种方案都是官方推荐的静态资源处理方式,能很好地满足你提升代码可读性的需求。

内容的提问来源于stack exchange,提问作者Jan Málek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:06:16