Bagaimana cara mendapatkan URI dari File aset?

127

Saya telah mencoba mendapatkan jalur URI untuk file aset.

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

Ketika saya memeriksa apakah file tersebut ada, saya melihat file itu tidak ada

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

Dapatkah seseorang memberi tahu saya bagaimana saya dapat menyebutkan jalur absolut untuk file yang ada di folder aset

Titus
sumber

Jawaban:

160

Tidak ada "jalur absolut untuk file yang ada di folder aset". Konten assets/folder proyek Anda dikemas dalam file APK. Gunakan AssetManagerobjek untuk mendapatkan InputStreamaset.

Karena WebView, Anda dapat menggunakan file Uriskema dengan cara yang sama seperti Anda menggunakan URL. Sintaks untuk aset adalah file:///android_asset/...(catatan: tiga garis miring) di mana elipsis adalah jalur file dari dalam assets/folder.

CommonsWare
sumber
32
file://android_asset/..., di mana ...jalur relatif dalam assets/direktori proyek Anda .
CommonsWare
4
Berikut adalah contoh proyek yang digunakan file://android_asset/, meskipun tidak untuk Uri: github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1
CommonsWare
20
@CommonsWare sepertinya Anda melewatkan '/' di URI Anda. Seharusnya begitu file:///.
ThomasW
7
Saya mencoba ini sebagai new File("file:///android_asset/sounds/beep.mid");, tetapi file hasil tidak ada. Ada ide? File PS ada di assets/sounds/folder.
paman Lem
3
Apakah benar bahwa ´file: ///android_asset/...´ hanya berfungsi di WebView dan tidak mungkin mendapatkan InputStream menggunakan URI / URL / Uri di luar WebView?
Lubbo
74

Url yang benar adalah:

file:///android_asset/RELATIVEPATH

di mana RELATIVEPATH adalah jalur ke sumber daya Anda relatif ke folder aset.

Perhatikan 3 / dalam skema. Tampilan web tidak akan memuat aset saya tanpa 3. Saya mencoba 2 seperti (sebelumnya) dikomentari oleh CommonsWare dan tidak akan berhasil. Kemudian saya melihat sumber CommonsWare di github dan melihat garis miring ke depan ekstra.

Pengujian ini meskipun hanya dilakukan pada emulator Android 1.6 tetapi saya ragu perbedaannya pada perangkat nyata atau versi yang lebih tinggi.

EDIT: CommonsWare memperbarui jawabannya untuk mencerminkan perubahan kecil ini. Jadi saya telah mengedit ini sehingga masih masuk akal dengan jawabannya saat ini.

Russ
sumber
Tidak berfungsi lagi String fileName = "file:///android_asset/file.csv"; System.out.println(new File(fileName).exists()); // prints false
Elgirhath
@Elgirhath, konstruktor untuk Fileyang menerima string mengharapkan jalur bukan URI . Saya belum membuat kode untuk Android selama beberapa tahun dan banyak hal mungkin telah berubah. Saya tidak yakin apakah Anda dapat mengakses folder aset yang disematkan menggunakan kelas File java normal. Sepertinya saya ingat bahwa Anda harus menggunakan AssetManager . File dalam folder assets ditempatkan di perangkat dalam paket APK hanya-baca dan dikompresi (APK sebenarnya adalah file zip), sehingga lebih banyak pekerjaan untuk membacanya kembali. Cobalah sesuatu sepertinew File(new URI(filename))
Russ
10

Silakan coba kode ini berfungsi dengan baik

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

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

Akhirnya, saya menemukan cara untuk mendapatkan jalur file yang ada di aset dari jawaban ini di Kotlin. Di sini kita menyalin file aset ke cache dan mendapatkan jalur file dari file cache itu.

@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)
                    }
                  }
                }
            }

Dapatkan jalur ke file seperti:

val filePath =  getFileFromAssets(context, "fileName.extension").absolutePath
Shylendra Madda
sumber
1
Perhatikan bahwa jika fileNamememiliki direktori dir/file. Ini akan crash dengan jalur yang cache/dir/filetidak ada. Juga saya pikir lebih baik memeriksa if(!it.exist)di dalam alsoblok, maka itu tidak akan menyalin file setiap kali bahkan file sudah ada di cache
Yeung
@ShylendraMadda, @Yeung, if(!it.exist)menunjukkan kesalahan referensi yang belum terselesaikan. ada solusi?
binrebin
Periksa apakah file itu ada di cache Anda dengan nama file itu? @binrebin
Shylendra Madda
@ShylendraMadda, saya hanya tahu nama file. Bisakah kita memuatnya dengan skrip tanpa mengetahui uri
binrebin yang
Saya pikir if(!it.exist)harus menempatkan sebelumnya it.outputStream()...
Yeung
7

masukkan deskripsi gambar di sini

Pastikan, folder aset Anda diletakkan di posisi yang benar.

Chuanhang.gu
sumber
Anda dapat meletakkannya di mana pun Anda inginkan dan menentukan jalur di file build.gradle Anda sebagai berikutsourceSets { main { assets.srcDirs = ['src/main/assets'] } }
Marcel Bro
2
Bagaimana cara mendapatkan jalur hello.html? tolong tambahkan
Rohit Singh
6

Berfungsi untuk WebView tetapi tampaknya gagal URL.openStream(). Jadi, Anda perlu membedakan file: // protocols dan menanganinya melalui AssetManager seperti yang disarankan.

Gaylord Zach
sumber
4

Coba ini, berhasil:

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

Jika Anda mendapatkan Pengecualian Nilai Null, coba ini (dengan kelas TopBrandData):

InputStream in_s1 =
    TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");
Jaspreet Singh
sumber
Jika tidak berfungsi, coba yang ini: InputStream in_s1 = TopBrandData.class.getResourceAsStream ("/ assets / TopBrands.xml");
Jaspreet Singh
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;
}
jayesh kavathiya
sumber
1

coba ini :

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

Saya telah melakukannya dan berhasil

Nyle
sumber
2
Sebenarnya itu berhasil. Periksa ContentResolver.openAssetFileDescriptor
Hippo Seven
1
Bekerja. Terima kasih banyak. Lol, saya hanya mencari file internal URI // BUAT RAW FOLDER DI DALAM RES, MAKA NAMA FILE HANYA BERISI a..z0..9 karakter, TANPA UPPERCASE !!!
phnghue
0

Ya Anda tidak dapat mengakses folder drive Anda dari ponsel atau emulator android Anda karena komputer dan android Anda adalah dua OS yang berbeda. Saya akan menggunakan folder res android karena memiliki metode manajemen sumber daya yang baik. Sampai dan kecuali Anda memiliki alasan yang sangat bagus untuk meletakkan file Anda di folder aset. Sebaliknya Anda bisa melakukan ini

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);
 }
willnotquit
sumber
-7

Berhasil untuk saya Coba kode ini

   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();
 }
Irfan Ali
sumber