Bir varlık dosyasından URI nasıl alınır?


127

Bir varlık dosyası için URI yolunu almaya çalışıyorum.

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

Dosyanın var olup olmadığını kontrol ettiğimde o dosyanın var olmadığını görüyorum

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

Biri bana varlık klasöründe bulunan bir dosyanın mutlak yolundan nasıl bahsedebileceğimi söyleyebilir mi?

Yanıtlar:


160

"Varlık klasöründe bulunan bir dosyanın mutlak yolu" yoktur. Projenizin assets/klasörünün içeriği APK dosyasında paketlenmiştir. Bir varlık üzerinde bir AssetManagerşey elde etmek için bir nesne kullanın InputStream.

İçin WebViewkullanabileceğiniz file Urihemen aynı şekilde şemayı bir URL kullanmak. Varlıklar için sözdizimi file:///android_asset/...(not: üç eğik çizgi) olup burada üç nokta, dosyanın assets/klasör içindeki yoludur .


32
file://android_asset/..., ...projenizin assets/dizini içindeki göreli yol nerede .
CommonsWare

4
İşte kullanarak örnek bir projedir file://android_asset/değil için olsa Uri: github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1
CommonsWare

20
@CommonsWare URI'nizde bir '/' eksik gibi görünüyor. Olmalı file:///.
ThomasW

7
Bunu olarak denedim new File("file:///android_asset/sounds/beep.mid");ama sonuç dosyası yok. Herhangi bir fikir? PS dosyası assets/sounds/klasörde.
Lem Amca

3
"File: ///android_asset/..." yalnızca WebView'da çalışıyor ve WebView dışında URI / URL / Uri kullanarak InputStream almak mümkün değil mi?
Lubbo

74

Doğru url:

file:///android_asset/RELATIVEPATH

burada RELATIVEPATH, varlıklar klasörüne göre kaynağınızın yoludur.

Şemadaki 3 / 'lere dikkat edin. Web görünümü, 3 olmadan varlıklarımdan hiçbirini yüklemedi. 2'yi (önceden) CommonsWare tarafından yorumlandığı gibi denedim ve işe yaramadı. Sonra CommonsWare'in github'daki kaynağına baktım ve fazladan eğik çizgiyi fark ettim.

Bu test, yalnızca 1.6 Android emülatöründe yapıldı, ancak gerçek bir cihazda veya daha yüksek bir sürümde farklı olduğundan şüpheliyim.

DÜZENLEME: CommonsWare, yanıtını bu küçük değişikliği yansıtacak şekilde güncelledi. Bu yüzden bunu düzenledim, böylece mevcut cevabıyla hala anlamlı.


Artık çalışmıyor String fileName = "file:///android_asset/file.csv"; System.out.println(new File(fileName).exists()); // prints false
Elgirhath

@Elgirhath Filebir dizeyi kabul eden kurucu URI değil bir yol bekliyor . Birkaç yıldır Android için kod yazmadım ve işler değişmiş olabilir. Gömülü varlıklar klasörüne normal bir java File sınıfı kullanarak erişip erişemeyeceğinizden emin değilim. Bir AssetManager kullanmanız gerektiğini hatırlıyorum . Varlıklar klasöründeki dosyalar, cihaza salt okunur paketlenmiş APK'de yerleştirilir ve sıkıştırılır (APK'ler aslında zip dosyalarıdır), bu nedenle geri okumak için daha fazla çalışma yapılır. new File(new URI(filename))
Şuna

10

Lütfen bu kodun düzgün çalışmasını deneyin

 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

Son olarak, Varlıklarda bulunan bir dosyanın yolunu Kotlin'deki bu cevaptan almanın bir yolunu buldum . Burada varlıklar dosyasını önbelleğe kopyalıyor ve dosya yolunu bu önbellek dosyasından alıyoruz.

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

Dosyanın yolunu şu şekilde alın:

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

1
Eğer fileNamedizini varsa dikkat edin dir/file. Var cache/dir/fileolmayan yolla çökecek . Ayrıca bloğun if(!it.exist)içinde bir kontrol yapmanın daha iyi olacağını düşünüyorum also, o zaman dosya zaten önbellekte olsa bile dosyayı kopyalamayacak
Yeung

@ShylendraMadda, @Yeung, if(!it.exist)çözülmemiş bir referans hatası veriyor. herhangi bir çözüm ?
binrebin

Önbelleğinizde bu dosya adına sahip dosyanın var olup olmadığını kontrol edin. @binrebin
Shylendra Madda

@ShylendraMadda, sadece dosya adını biliyorum. Gerçek
uri'yi

Sanırım if(!it.exist)önce koymalıyım it.outputStream()...
Yeung

7

görüntü açıklamasını buraya girin

Varlıklar klasörünüzün doğru konuma yerleştirildiğinden emin olun.


Bunu istediğiniz yere koyabilir ve build.gradle dosyanızda yolu şu şekilde tanımlayabilirsinizsourceSets { main { assets.srcDirs = ['src/main/assets'] } }
Marcel Bro

2
Hello.html yolunu nasıl elde edebilirim? lütfen ekleyin
Rohit Singh

6

WebView için çalışıyor, ancak başarısız görünüyor URL.openStream(). Bu nedenle, file: // protokollerini ayırt etmeniz ve bunları önerilen şekilde AssetManager aracılığıyla işlemeniz gerekir.


4

Bunu deneyin, işe yarıyor:

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

Boş Değer İstisnası alırsanız, şunu deneyin (sınıfla TopBrandData):

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

Çalışmıyorsa, lütfen şunu deneyin: 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;
}

1

bunu dene :

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

Yaptım ve işe yaradı



1
Çalışmış. Çok teşekkürler. Lol, sadece URI dahili dosya almak istiyorum // RES İÇİNDE RAW KLASÖR OLUŞTUR, SONRA AD DOSYASI YALNIZCA a..z0..9 karakter içeriyor, BÜYÜK HARF YOK !!!
phnghue

0

Evet, sürücü klasörünüze android telefonunuzdan veya emülatörünüzden erişemezsiniz çünkü bilgisayarınız ve android iki farklı işletim sistemidir. Android'in res klasörüne giderdim çünkü iyi kaynak yönetimi yöntemlerine sahiptir. Dosyanızı varlıklar klasörüne koymak için çok iyi bir nedeniniz olmadığı sürece. Bunun yerine bunu yapabilirsin

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

Benim için çalıştı Bu kodu deneyin

   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();
 }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.