如何从R.raw资源获取java.io.File

时间:2017-12-24 23:54:18

标签: android kotlin

我在Android Studio项目中添加了原始资源:

然后我需要一个指向它的java.io.File实例。

我尝试了三件事,但是找不到文件而且File.exists()等于false:

// Option 1:
//
//     com.example.myapp:raw/plano_metrobus
//
val fileName = resources.getResourceName(R.raw.plano_metrobus)
Log.w("xxx", fileName)
Log.w("xxx", File(fileName).exists().toString())

// Option 2
//
//     android.resource://com.example.myapp:raw/plano_metrobus
//
val uri = Uri.parse("android.resource://" + fileName)
Log.w("xxx", uri.toString())
Log.w("xxx", File(uri.toString()).exists().toString())

// Option 3
//
//     android.resource://com.example.myapp/2131427328
//
val uri2 = Uri.parse("android.resource://" + packageName + "/" + R.raw.plano_metrobus)
Log.w("xxx", uri2.toString())
Log.w("xxx", File(uri2.toString()).exists().toString())

创建File对象的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

  

然后我需要一个指向它的java.io.File实例。

这不是直接可能的。它是您的开发计算机上的文件。它不是设备上的文件。

  

获取File对象的正确方法是什么?

理想情况下,你没有。您无法修改资源,并且希望无论您使用哪种接受File,都可以接受InputStream。如果是,use openRawResource() on a Resources object,您可以通过getResources()ContextActivity)致电Service来获取其中一个。

如果您使用的是编写不好且需要文件的第三方库,则需要使用openRawResource()方法,然后将InputStream中的字节复制到您的某个文件中控制(例如,在getCacheDir()中)。然后,您可以使用生成的文件。

答案 1 :(得分:0)

根据之前的建议,我最终使用Context.getCacheDir()创建了该文件的未压缩版本,然后能够将其与PdfRenderer一起使用。这是解决方案:

val FILENAME = "FileName.pdf"
val file = File(applicationContext.cacheDir, FILENAME)
if (!file.exists()) {
    val input = resources.openRawResource(R.raw.plano_metrobus)
    val output = FileOutputStream(file)

    val buffer = ByteArray(1024)
    while (true) {
        val size = input.read(buffer)
        if (size == -1) {
            break;
        }
        output.write(buffer, 0, size)
    }

    input.close()
    output.close()
}

val fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
val renderer = PdfRenderer(fileDescriptor)