2017-12-24 20 views
0

からのjava.io.Fileを取得するにはどのように私は私のAndroid Studioプロジェクトに生のリソースを追加しました: R.rawリソース

は、その後、私はそれを指して java.io.Fileインスタンスを取得する必要があります。

私は3つのことを試してみましたが、ファイルが見つからないとFile.exists()が等しい偽です:

// 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

次に、それを指し示すjava.io.Fileインスタンスを取得する必要があります。

これは直接可能ではありません。開発マシン上のファイルです。デバイス上のファイルではありません。

Fileオブジェクトを取得する正しい方法は何ですか?

理想的には、そうではありません。リソースを変更することはできません。Fileを受け入れているものを使用している場合は、InputStreamも受け入れることができます。その場合はuse openRawResource() on a Resources objectとなり、ContextActivityServiceなど)のgetResources()を呼び出してその1つを取得します。

あなたが悪い書かれたファイルを必要としたいくつかのサードパーティのライブラリを使用している場合、あなたは(getCacheDir()で、例えば)を制御するいくつかのファイルにそのInputStreamからバイトをコピーし、そのopenRawResource()アプローチを使用する必要があります。結果ファイルを使用することができます。

+0

私は[ParcelFileDescriptor](https://developer.android.com/reference/android/os/ParcelFileDescriptor.html)を使用しています、と私は代替が表示されません。ストリームをコピーするオプションを試してみます。 – kiewic

+0

PdfRendererで使用する。 – kiewic

+0

「あなたの開発マシン上のファイルですが、正しくは聞こえません。 'raw'リソースはapkにあります – njzk2

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)