자산 파일에서 URI를 얻는 방법은 무엇입니까?


127

자산 파일의 URI 경로를 얻으려고했습니다.

uri = Uri.fromFile(new File("//assets/mydemo.txt"));

파일이 존재하는지 확인할 때 파일이 존재하지 않는다는 것을 알 수 있습니다.

File f = new File(filepath);
if (f.exists() == true) {
    Log.e(TAG, "Valid :" + filepath);
} else {
    Log.e(TAG, "InValid :" + filepath);
}

누군가가 자산 폴더에있는 파일의 절대 경로를 어떻게 언급 할 수 있는지 말해 줄 수 있습니까?

답변:


160

"자산 폴더에있는 파일의 절대 경로"는 없습니다. 프로젝트 assets/폴더 의 콘텐츠 는 APK 파일에 패키징됩니다. 자산 AssetManager을 얻기 위해 개체를 사용합니다 InputStream.

의 경우 URL을 사용하는 것과 동일한 방식으로 스키마를 WebView사용할 수 있습니다 file Uri. 자산 구문은 file:///android_asset/...(참고 : 세 개의 슬래시) 여기서 줄임표는 assets/폴더 내 파일의 경로입니다 .


32
file://android_asset/..., 여기서은 ...프로젝트 assets/디렉토리 내의 상대 경로 입니다.
CommonsWare 2011 년

4
여기에 사용하여 샘플 프로젝트 file://android_asset/가 아닌 대한 비록, Uri: github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1
CommonsWare

20
@CommonsWare URI에서 '/'를 놓친 것 같습니다. 이어야합니다 file:///.
ThomasW 2011

7
로 시도 new File("file:///android_asset/sounds/beep.mid");했지만 결과 파일이 존재하지 않습니다. 어떤 아이디어? PS 파일이 assets/sounds/폴더에 있습니다.
삼촌 Lem

3
´file : ///android_asset/...´가 WebView에서만 작동하고 WebView 외부에서 URI / URL / Uri를 사용하여 InputStream을 가져올 수 없다는 것이 맞습니까?
Lubbo

74

올바른 URL은 다음과 같습니다.

file:///android_asset/RELATIVEPATH

여기서 RELATIVEPATH는 자산 폴더에 상대적인 리소스 경로입니다.

노트구성표의 3 /에 하십시오. 웹보기는 3 없이는 내 자산을로드하지 않습니다. 나는 CommonsWare에 의해 (이전) 주석으로 2를 시도했지만 작동하지 않습니다. 그런 다음 github에서 CommonsWare의 소스를 살펴보고 추가 슬래시를 발견했습니다.

이 테스트는 1.6 Android 에뮬레이터에서만 수행되었지만 실제 장치 또는 상위 버전에서는 다른 점이 의심됩니다.

편집 : CommonsWare는이 작은 변경 사항을 반영하기 위해 답변을 업데이트했습니다. 그래서 나는 이것을 편집하여 그의 현재 답변으로 여전히 의미가 있습니다.


더 이상 작동하지 않음 String fileName = "file:///android_asset/file.csv"; System.out.println(new File(fileName).exists()); // prints false
Elgirhath

@Elgirhath는 File문자열을 받아들이 는 생성자 가 URI가 아닌 경로를 기대하고 있습니다. 저는 몇 년 동안 Android 용으로 코딩하지 않았으며 상황이 변경되었을 수 있습니다. 일반 Java File 클래스를 사용하여 임베디드 자산 폴더에 액세스 할 수 있는지 확실하지 않습니다. AssetManager 를 사용해야한다는 것을 기억하는 것 같습니다 . asset 폴더의 파일은 읽기 전용 번들 APK의 기기에 배치되고 압축되므로 (APK는 실제로 zip 파일 임) 다시 읽어 오는 데 더 많은 작업이 필요합니다. 같은 시도new File(new URI(filename))
Russ

10

이 코드가 잘 작동하도록 시도하십시오

 Uri imageUri = Uri.fromFile(new File("//android_asset/luc.jpeg"));

    /* 2) Create a new Intent */
    Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
            .setData(imageUri)
            .build();

8

마지막으로 Kotlin 의이 답변에서 자산에 존재하는 파일의 경로를 얻는 방법을 찾았습니다 . 여기에서는 자산 파일을 캐시에 복사하고 해당 캐시 파일에서 파일 경로를 가져옵니다.

@Throws(IOException::class)
    fun getFileFromAssets(context: Context, fileName: String): File = File(context.cacheDir, fileName)
            .also {
               if (!it.exists()) {
                it.outputStream().use { cache ->
                    context.assets.open(fileName).use { inputStream ->
                            inputStream.copyTo(cache)
                    }
                  }
                }
            }

다음과 같이 파일 경로를 가져옵니다.

val filePath =  getFileFromAssets(context, "fileName.extension").absolutePath

1
공지 사항 (가) 경우 그 fileName디렉토리가 dir/file. cache/dir/file존재하지 않는 경로와 충돌 합니다. 또한 블록 if(!it.exist)내부를 확인하는 것이 좋습니다 also. 그러면 파일이 이미 캐시에 있더라도 매번 파일을 복사하지 않을 것입니다
Yeung

@ShylendraMadda, @Yeung, if(!it.exist)오류가 해결되지 않은 참조입니다. 어떤 해결책?
binrebin

해당 파일 이름으로 캐시에 파일이 있는지 확인 하시겠습니까? @binrebin
Shylendra Madda

@ShylendraMadda, 파일 이름 만 알고 있습니다. 실제 URI를 모르고 스크립트로로드 할 수 있습니까?
binrebin

if(!it.exist)전에 넣어야 할 것 같아요 it.outputStream()...

7

여기에 이미지 설명 입력

자산 폴더가 올바른 위치에 있는지 확인하십시오.


원하는 곳에 넣고 다음과 같이 build.gradle 파일에 경로를 정의 할 수 있습니다.sourceSets { main { assets.srcDirs = ['src/main/assets'] } }
Marcel Bro

2
hello.html의 경로를 얻는 방법은 무엇입니까? 추가하십시오
Rohit Singh 19

6

WebView에서 작동하지만 URL.openStream(). 따라서 file : // 프로토콜을 구별하고 제안 된대로 AssetManager를 통해 처리해야합니다.


4

이것을 시도해보십시오.

InputStream in_s = 
    getClass().getClassLoader().getResourceAsStream("TopBrands.xml");

Null 값 예외가 발생하면 다음을 시도하십시오 (class와 함께 TopBrandData).

InputStream in_s1 =
    TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");

작동하지 않으면 다음을 시도해보십시오. InputStream in_s1 = TopBrandData.class.getResourceAsStream ( "/ assets / TopBrands.xml");
재 스프리트 싱

3
InputStream is = getResources().getAssets().open("terms.txt");
String textfile = convertStreamToString(is);
    
public static String convertStreamToString(InputStream is)
        throws IOException {

    Writer writer = new StringWriter();
    char[] buffer = new char[2048];

    try {
        Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        int n;
        while ((n = reader.read(buffer)) != -1) {
            writer.write(buffer, 0, n);
        }
    } finally {
        is.close();
    }

    String text = writer.toString();
    return text;
}

1

이 시도 :

Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.cat); 

나는 그것을했고 그것은 작동했다



1
일했다. 감사합니다. Lol, 난 그냥 URI 내부 파일을 찾고 // RES 내부에 RAW 폴더를 만들고 이름 파일은 a..z0..9 문자 만 포함하고 대문자는 없습니다 !!!
phnghue

0

예, 컴퓨터와 안드로이드가 서로 다른 OS이기 때문에 안드로이드 폰이나 에뮬레이터에서 드라이브 폴더에 액세스 할 수 없습니다. 좋은 리소스 관리 방법이 있기 때문에 안드로이드의 res 폴더로 갈 것입니다. 자산 폴더에 파일을 넣어야 할 타당한 이유가 없을 때까지. 대신 당신은 이것을 할 수 있습니다

try {
      Resources res = getResources();
      InputStream in_s = res.openRawResource(R.raw.yourfile);

      byte[] b = new byte[in_s.available()];
      in_s.read(b);
      String str = new String(b);
    } catch (Exception e) {
      Log.e(LOG_TAG, "File Reading Error", e);
 }

-7

나를 위해 일했다이 코드를 사용해보십시오

   uri = Uri.fromFile(new File("//assets/testdemo.txt"));
   String testfilepath = uri.getPath();
    File f = new File(testfilepath);
    if (f.exists() == true) {
    Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show();
    } else {
   Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show();
 }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.