【发布时间】:2021-09-27 22:50:58
【问题描述】:
我们在 KMM shared/commonMain 项目中包含一个 assets 文件夹。 这个asset文件夹基本上包含了很多JSON文件,结构在不同的子文件夹中。
在 build.gradle 中,assets 文件夹被添加为 android 资源,因此它包含在构建 AAR 的根目录中。
android {
compileSdkVersion(29)
sourceSets["main"].resources.srcDirs("src/commonMain/assets")
...
在共享模块中,文件是在commonAndroid中按需读取的
val file = this::class.java.classLoader!!.getResource(folder1/file1.json)
这很好用。
现在问题来了,读取一个文件夹:
val folder= this::class.java.classLoader!!.getResource(folder1)
这在通过单元测试执行代码时有效,然后返回文件夹。 一旦构建 AAR 并将其包含在 Android 应用程序中,此行始终返回 null。
请记住,文件已正确添加到 AAR,并且可以在指定文件路径时读取它们。它只是不能仅使用文件夹路径。
有没有办法从 KMM 项目中的 AAR 模块的目录中获取所有文件?
iOS 解决方案正在运行,所以它真的只是关于 android。
编辑 1: 澄清一下,目标不是向外部用户提供对文件夹/文件的访问权限,而是使用 KMM 通用模块本身中的文件。
我正在寻找任何方式来处理文件和文件夹,一旦项目作为 AAR 分发并用作第三方库,它们也可以工作。
编辑 2: 目前似乎没有解决方案来访问 AAR 中的 JARS 中的文件夹。
所以我们切换到一种解决方法,在构建时生成文件夹中所有文件的索引文件,并在运行时使用此信息从特定文件夹中获取所有文件,使用 this::class.java.classLoader!!.getResource(path)(因为 getResource 适用于文件, 只是不适用于文件夹)
【问题讨论】:
-
一旦你有了一个“文件夹”,你将如何继续列出文件和子文件夹?
-
使用
val absoluteFolderPath = folder.path获取绝对路径并继续使用File(folderPathAbsolute).listFiles等。我认为肯定会有共享资源的KMM 功能,但找不到任何东西。 -
您不能将 File 类用于资产。那永远行不通。但是你说它以这种方式与单元测试一起工作?不可能。
-
好的,我认为文件夹名称“资产”具有误导性。它只是库中的一个随机文件夹,其中包含应在库中读取的文件。它与库外的 android 资产无关。
-
我意识到这条消息来得太晚了,而且并不过分相关,但是你有这个问题的完整解决方案吗?我在 Android 上进行文件检查/加载工作,但在 iOS 端却苦苦挣扎......
标签: android kotlin-multiplatform