সম্পদ ফাইল থেকে কীভাবে ইউআরআই পাবেন?


127

আমি কোনও সম্পদ ফাইলের জন্য ইউআরআই পথ পাওয়ার চেষ্টা করছি।

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

এর জন্য WebView, আপনি file Uriকোনও ইউআরএল ব্যবহার করার মতোভাবে স্কিমটি ব্যবহার করতে পারেন । সম্পদের জন্য সিনট্যাক্সটি file:///android_asset/...(দ্রষ্টব্য: তিনটি স্ল্যাশ) যেখানে এললিপসিসটি assets/ফোল্ডারের মধ্যে থেকে ফাইলটির পথ ।


32
file://android_asset/..., ...আপনার প্রকল্পের assets/ডিরেক্টরিতে আপেক্ষিক পথটি কোথায় ।
কম্যান্সওয়ের

4
এখানে একটি নমুনা প্রকল্প ব্যবহার করছে file://android_asset/, যদিও এটির জন্য নয় Uri: github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1
CommonsWare

20
@ কমন্সসও এটির মতো দেখে মনে হচ্ছে আপনি আপনার ইউআরআইতে একটি '/' মিস করেছেন। এটা হওয়া উচিত file:///
টমাসডাব্লু

7
আমি এটি হিসাবে চেষ্টা করেছি new File("file:///android_asset/sounds/beep.mid");, তবে ফলাফল ফাইলটি বিদ্যমান নেই। কোন ধারনা? পিএস ফাইল assets/sounds/ফোল্ডারে রয়েছে।
চাচা লেম

3
এটি কি ঠিক যে ফাইল: ///android_asset/...´ only কেবল ওয়েবভিউতে কাজ করে এবং ওয়েবউইউর বাইরে ইউআরআই / ইউআরএল / উরি ব্যবহার করে ইনপুটস্ট্রিম পাওয়া সম্ভব নয়?
লুব্বো

74

সঠিক ইউআরএল হ'ল:

file:///android_asset/RELATIVEPATH

সম্পদ ফোল্ডারের তুলনায় যেখানে রিলেটিভপথ আপনার সংস্থানটির পথ।

স্কিমের 3 / 'গুলি নোট করুন। ওয়েব ভিউ 3 ছাড়া আমার যে কোনও সম্পদ লোড করবে না Comm আমি কমন্সওয়্যার দ্বারা মন্তব্য করা (পূর্বে) হিসাবে 2 টি চেষ্টা করেছি এবং এটি কার্যকর হবে না। তারপরে আমি গিথুব-এ কমন্সওয়্যারের উত্সের দিকে তাকিয়ে অতিরিক্ত ফরোয়ার্ড স্ল্যাশ লক্ষ্য করেছি।

যদিও এই পরীক্ষাটি কেবলমাত্র 1.6 অ্যান্ড্রয়েড এমুলেটারে করা হয়েছিল তবে আমি বাস্তব ডিভাইস বা উচ্চতর সংস্করণে এটির ভিন্ন সন্দেহ।

সম্পাদনা: কমন্সওয়্যার এই ক্ষুদ্র পরিবর্তনটি প্রতিফলিত করতে তার উত্তর আপডেট করেছে। সুতরাং আমি এটি সম্পাদনা করেছি যাতে এটি তার বর্তমান উত্তর দিয়ে এখনও বোঝা যায়।


আর কাজ করে না String fileName = "file:///android_asset/file.csv"; System.out.println(new File(fileName).exists()); // prints false
এলগিরহথ

@ এলগিরহথ এর জন্য কনস্ট্রাক্টর Fileস্ট্রিং স্বীকার করে এমন কোনও ইউআরআই নয় এমন পথের প্রত্যাশা করছেন । আমি কয়েক বছর ধরে অ্যান্ড্রয়েডের জন্য কোডিং করি নি এবং জিনিসগুলি পরিবর্তিত হতে পারে। আপনি যদি কোনও সাধারণ জাভা ফাইল শ্রেণি ব্যবহার করে এমবেড করা সম্পদ ফোল্ডারটি অ্যাক্সেস করতে পারেন তবে আমি নিশ্চিত নই। আমি মনে করি মনে হচ্ছে আপনাকে একটি এসেটম্যানেজার ব্যবহার করতে হবে । সম্পদ ফোল্ডারে থাকা ফাইলগুলি কেবল পঠনযোগ্য বান্ডিলযুক্ত এপিএতে ডিভাইসে স্থাপন করা হয় এবং সংকুচিত হয় (এপিপিগুলি আসলে জিপ ফাইল হয়), এটি আবার পড়ার জন্য আরও কাজ করে। এর মতো কিছু চেষ্টা করুনnew File(new URI(filename))
রাশ

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

শেষ অবধি, আমি কোটলিনে এই উত্তর থেকে সম্পদে উপস্থিত একটি ফাইলের পথ পাওয়ার একটি উপায় খুঁজে পেয়েছি । এখানে আমরা সম্পদের ফাইলটি ক্যাশে অনুলিপি করছি এবং সেই ক্যাশে ফাইল থেকে ফাইলের পাথ পাচ্ছি।

@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, তবে এটি প্রতিবার ফাইলটি অনুলিপি করবে না এমনকি ফাইলটি ইতিমধ্যে ক্যাশে রয়েছে
ইয়েং

@ শৈলেন্দ্রমদ্দা, @ ইয়ুং, if(!it.exist)একটি ত্রুটি অমীমাংসিত রেফারেন্স দেখায় । কোন সমাধান?
বিন্রেবিন

আপনার ক্যাশে সেই ফাইলটির নামের সাথে ফাইলটি উপস্থিত আছে কিনা তা পরীক্ষা করে দেখুন? @ বিনরেবিন
শৈলেন্দ্র মাদদা

শৈলেন্দ্রমদ্দা, আমি কেবল ফাইলের নাম জানি। আমরা কি প্রকৃত ইউরি না জেনে স্ক্রিপ্ট দিয়ে লোড করতে পারি
বিন্রেবিন

আমি মনে করি if(!it.exist)আগে রাখা উচিত it.outputStream()...
ইয়েং

7

এখানে চিত্র বর্ণনা লিখুন

নিশ্চিত হন, আপনার সম্পদ ফোল্ডারটি সঠিক অবস্থানে রেখেছিল।


আপনি যেখানে চান সেখানে এটি স্থাপন করতে পারেন এবং আপনার বিল্ড.gradle ফাইলে পাথটি নীচের মতো সংজ্ঞায়িত করতে পারেনsourceSets { main { assets.srcDirs = ['src/main/assets'] } }
মার্সেল ব্রো

2
হ্যালো। Html এর পথ কীভাবে পাবেন? দয়া করে যুক্ত করুন
রোহিত সিং

6

ওয়েবভিউয়ের জন্য কাজ করে তবে ব্যর্থ বলে মনে হচ্ছে URL.openStream()। সুতরাং আপনাকে ফাইল: // প্রোটোকল আলাদা করতে হবে এবং পরামর্শ অনুযায়ী এসেটম্যানেজারের মাধ্যমে সেগুলি হ্যান্ডেল করতে হবে।


4

এটি ব্যবহার করে দেখুন, এটি কার্যকর:

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

আপনি যদি একটি নাল মান ব্যতিক্রম পান তবে এটি চেষ্টা করুন (শ্রেণি সহ TopBrandData):

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

যদি কাজ না করে থাকে তবে দয়া করে এটি ব্যবহার করে দেখুন: ইনপুটস্ট্রিম ইন_এস 1 = টপব্রেন্ডডাটা.ক্লাস.জেট রিসোর্সএস্ট্রিম ("/ সম্পদ / টপব্র্যান্ডসএক্সএমএল");
জাসপ্রীত সিং 8

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); 

আমি এটা করেছি এবং এটি কাজ করে


2
আসলে এটি কাজ করে। পরীক্ষা করে দেখুন ContentResolver.openAssetFileDescriptor
জলহস্তীর বাচ্চার সেভেন

1
কাজ করছে. অনেক ধন্যবাদ. হ্যাঁ, আমি কেবল ইউআরআই অভ্যন্তরীণ ফাইলটি খুঁজছি // র র ফোল্ডারটি অন্তর্নির্মিত রসে তৈরি করুন, কেবলমাত্র নাম ফাইলটি কেবলমাত্র একটি..জ0..9 অক্ষর তৈরি করুন, কোনও আপত্তি নেই !!!
phnghue

0

হ্যাঁ আপনি আপনার অ্যান্ড্রয়েড ফোন বা এমুলেটর থেকে আপনার ড্রাইভ ফোল্ডারটি অ্যাক্সেস করতে পারবেন না কারণ আপনার কম্পিউটার এবং অ্যান্ড্রয়েড দুটি পৃথক ওএস and যতক্ষণ না আপনার কাছে সম্পদ ফোল্ডারে ফাইল দেওয়ার খুব ভাল কারণ রয়েছে unless পরিবর্তে আপনি এটি করতে পারেন

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.