kotlin Android Studio :为项目资源文件夹中的目录创建文件对象

ekqde3dh  于 2023-02-05  发布在  Kotlin
关注(0)|答案(2)|浏览(228)

我的RAW目录中有一个文件夹,里面装满了图像和视频。我想在Kotlin中将此文件夹转换为文件对象,然后遍历其中的所有文件夹和文件,并将其转换为可用于我的应用的媒体。
包含我的媒体的目录(我想将其转换为文件对象,这是我遇到的问题):

val basePath = Paths.get("").toAbsolutePath().toString()
traverse(db, File("$basePath/app/src/main/res/raw/media1")) // This is a directory, and it's not being seen using this code.

traverse()方法遍历media 1目录,并将找到的所有图像/视频转换为应用可用的媒体。

fun traverse(db: SQLiteDatabase?, dir : File) {
        if (dir.exists()) {
            val files = dir.listFiles()
            if (files != null) {
                for (i in 0 until files.count()) {
                    val file = files[i]
                    if (file.isDirectory) {
                        traverse(db, file)
                    } else {
                        saveFile(db, file) // This fun creates a database row for the media and saves the media file onto the local phone for later reference
                    }
                }
            }
        }
    }

我试着通过C盘访问目录,通过Paths.get命令,调用R. raw。无论如何,它似乎看不到“media 1”目录...

c3frrgcw

c3frrgcw1#

我想在Kotlin中将此文件夹转换为文件对象,然后遍历其中的所有文件夹和文件,并将其转换为可用于我的应用的媒体。
抱歉,这不是一个选项。将这组目录移动到assets/而不是raw/中会更好,然后使用AssetManager遍历树。然而,即使这样,您也不会得到文件,而是InputStreams,因为资产和资源都不是手机文件系统上的文件。
无论如何,似乎都看不到“media1”目录
部分原因是因为它们不是手机上的文件,部分原因是资源不支持子目录。

liwlm1x9

liwlm1x92#

这就是我的解决方案:

val fields : Array<Field> = R.raw::class.java.fields
        for (count in 0 until fields.count()) {
            val resourceID = fields[count].getInt(fields[count])
            
            val value = TypedValue()
            context!!.resources.getValue(resourceID, value, true)
            
            val inputStream: InputStream = context.resources.openRawResource(resourceID)
            val file : File = createTempFile(fields[count].name, '.' + value.string.toString().split('.')[1])
            inputStream.use {input ->
                file.outputStream().use {output ->
                    input.copyTo(output)
                }
            }
            saveFile(db, file)
        }

将各个媒体文件从其子目录移动到项目的原始资源文件夹中。
Android studio不允许遍历子目录,并且必须使用输入和输出流手动将资源加载到File对象中。我觉得很可笑,我们必须跳过这么多圈才能完成这么基本的事情。

相关问题