我在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
对象的正确方法是什么?
答案 0 :(得分:1)
然后我需要一个指向它的java.io.File实例。
这不是直接可能的。它是您的开发计算机上的文件。它不是设备上的文件。
获取File对象的正确方法是什么?
理想情况下,你没有。您无法修改资源,并且希望无论您使用哪种接受File
,都可以接受InputStream
。如果是,use openRawResource()
on a Resources
object,您可以通过getResources()
(Context
,Activity
)致电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)