2017-12-24 4 views
0

에서 java.io.File의를 얻으려면 어떻게 안드로이드 스튜디오 프로젝트에 원료 자원을 추가 : R.raw 자원

그럼 내가 가리키는 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

그런 다음이를 가리키는 java.io.File 인스턴스를 가져와야합니다.

이는 직접적으로 가능하지 않습니다. 개발 컴퓨터의 파일입니다. 장치의 파일이 아닙니다.

File 객체를 가져 오는 올바른 방법은 무엇입니까?

이상적으로는 그렇지 않습니다. 리소스를 수정할 수는 없으며 File을 수락하는 것을 사용하고 있다면 InputStream을 사용할 수도 있습니다. 그렇다면 use openRawResource() on a Resources object을 입력하고 Context (예 : Activity, Service)에 getResources()을 호출하여 그 중 하나를 얻습니다.

당신이 잘못 작성된하고 파일이 필요하고 일부 타사 라이브러리를 사용하는 경우 openRawResource() 방법은, 다음 (getCacheDir()에서, 예를 들어)를 제어 일부 파일에 그 InputStream에서 바이트를 복사하는 것이 사용해야합니다 . 그런 다음 결과 파일을 사용할 수 있습니다.

+0

내가 [된 ParcelFileDescriptor] (https://developer.android.com/reference/android/os/ParcelFileDescriptor.html)를 사용하고, 나는 대안을 볼 수 없습니다. 스트림을 복사하는 옵션을 시도해 보겠습니다. – kiewic

+0

PdfRenderer와 함께 사용합니다. – kiewic

+0

"개발 컴퓨터의 파일입니다." 원시 리소스는 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)