অ্যান্ড্রয়েডে কীভাবে কোনও ছবি সংস্থার ইউরি পাবেন of


97

নিম্নলিখিত হিসাবে একটি চিত্র দেখতে আমার একটি অভিপ্রায় খোলার প্রয়োজন:

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("@drawable/sample_1.jpg");
intent.setData(uri);
startActivity(intent);

সমস্যাটি হ'ল Uri uri = Uri.parse("@drawable/sample_1.jpg");ভুল।

উত্তর:


139

বিন্যাসটি হ'ল:

"android.resource://[package]/[res id]"

[প্যাকেজ] আপনার প্যাকেজের নাম

[রেস আইডি] হ'ল রিসোর্স আইডির মান eg

এটি একসাথে সেলাই করতে, ব্যবহার করুন

Uri path = Uri.parse("android.resource://your.package.name/" + R.drawable.sample_1);


4
উরি পথ = উরি.পারস ("android.resource: //net.londatiga.android.twitpic/" + আর.ড্রেব্যাবল.আইকন); স্ট্রিং এমপাথ = পাথ.টোস্ট্রিং (); আমি যখন এটি করছি তখন আমি এ জাতীয় কোনও ফাইল বা ডিরেক্টরি ত্রুটি
পাই

4
আমি যখন ইমেল সংযুক্তি হিসাবে ছবিটি প্রেরণের চেষ্টা করি তখন এটি ফাইলটি প্রেরণ করা হয় তবে .jpg এক্সটেনশন ছাড়াই। সুতরাং ছবিটি প্রাপকদের পিসিতে বৈধ নয়।
রুবেন

@hemanthkumar এই উত্তরটি একটি রেফারেন্স হিসাবে দেখুন: stackoverflow.com/a/8476930/62921 তিনি ব্যাখ্যা করেছেন যে আপনার মেশিন ব্যতীত আর কোনও অঙ্কনযোগ্য ফোল্ডার নেই। এ কারণেই এটি আইডি ব্যবহার করে এবং আপনার পাথ.আর স্ট্রিং () কাজ করে না।
ফোর্স ম্যাজিক

এটি আমার পক্ষে কাজ করে না। আমি ActivityNotFoundException পাই x (অ্যান্ড্রয়েড.কন্টেন্ট.একটিভিটি নটফাউন্ডএক্সেপশন: ইনট্যান্ট {অ্যাক্ট = অ্যান্ড্রয়েড.ইন্ট.অ্যাকশন.ভিউ দ্যাট = অ্যান্ড্রয়েড.সোর্স: // কম.মাইপ্যাকেজ.মায়াপ / 2130837582 handle। এলজি ই 400 অ্যান্ড্রয়েড 2.3.6 হ্যান্ডেল করতে কোনও কার্যকলাপ খুঁজে পাওয়া যায় নি
লুসিও ক্রুসকা

@ লুসিওক্রাসকা - সম্ভবত আপনার উদ্দেশ্যটি নির্দিষ্ট করা উচিত - এটি জেপিইগ বা পিএনজি চিত্র?
অ্যাক্সারিড্যাক্স

67

এখানে একটি পরিষ্কার সমাধান রয়েছে যা android.net.Uriক্লাসকে পুরোপুরিভাবে তার Builderপ্যাটার্নের মাধ্যমে উপস্থাপন করে , বারবার রচনা এবং ইউআরআই স্ট্রিংয়ের পচন এড়ায়, ইউআরআই সিনট্যাক্স সম্পর্কে হার্ড-কোডেড স্ট্রিং বা অ্যাডহক ধারণার উপর নির্ভর না করে fully

Resources resources = context.getResources();
Uri uri = new Uri.Builder()
    .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
    .authority(resources.getResourcePackageName(resourceId))
    .appendPath(resources.getResourceTypeName(resourceId))
    .appendPath(resources.getResourceEntryName(resourceId))
    .build();

কোটলিনের সাথে সামান্যতম মার্জিত:

fun Context.resourceUri(resourceId: Int): Uri = with(resources) {
    Uri.Builder()
        .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
        .authority(getResourcePackageName(resourceId))
        .appendPath(getResourceTypeName(resourceId))
        .appendPath(getResourceEntryName(resourceId))
        .build()
}

এটি আমার সমস্যার সমাধান করেছে। আমার ইউরির আকারটি "অ্যান্ড্রয়েড.সোর্স: //com.craiovadata.guessthecountry/drawable/sky" এর মতো ছিল
ড্যান আলবোোটানু

57
public static Uri resourceToUri(Context context, int resID) {
        return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                context.getResources().getResourcePackageName(resID) + '/' +
                context.getResources().getResourceTypeName(resID) + '/' +
                context.getResources().getResourceEntryName(resID) );
    }

9

ত্রুটিযুক্ত যারা, আপনি ভুল প্যাকেজের নাম লিখতে পারে। শুধু এই পদ্ধতিটি ব্যবহার করুন।

public static Uri resIdToUri(Context context, int resId) {
    return Uri.parse(Consts.ANDROID_RESOURCE + context.getPackageName()
                     + Consts.FORESLASH + resId);
}

কোথায়

public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FORESLASH = "/";

10
আপনি কি সত্যিই একটি ফোরস্ল্যাশ জন্য একটি ধ্রুবক তৈরি ??
সার্থেরিস স্টর্মহ্যামার

@ সার্থেরিসটোরহ্যামার হ্যাঁ :), যদিও আমি সাধারণত ফরস্ল্যাশ করার জন্য সিস্টেম ধ্রুবক ব্যবহার করি;)
স্যান্ডেলোন

4

আপনি ইমেজ রিসোর্সের ইউআরআই চান, এবং R.drawable.goombএটি একটি ইমেজ রিসোর্স। বিল্ডার ফাংশনটি ইউআরআই তৈরি করে যা আপনি জিজ্ঞাসা করছেন:

String resourceScheme = "res";
Uri uri = new Uri.Builder()
  .scheme(resourceScheme)
  .path(String.valueOf(intResourceId))
  .build();

সুতরাং আপনি "18" এর মতো কিছু পথে যাচ্ছেন। এটি ভুল বলে মনে হচ্ছে
নিক কার্ডোসো

@ নিককার্ডোসো আর.ড্রেবয়েবল.গোম্বা হ'ল আমার সংস্থান ফোল্ডারে আমার আঁকতে সক্ষম। যদি এর মান 18 হয় তবে এটি কি কার্য সম্পাদনকে ভুল করে?
Roide

অবশ্যই আছে। developer.android.com/references/android/net/… একটি সত্যিকারের পথটি সমাধান করতে আর ফাইলের আইডি ব্যবহার করা দরকার।
নিক কার্ডোসো

@ নিককার্ডোসো ধন্যবাদ জানায় তবে এটি হয় না এবং এটি পুরোপুরি কার্যকর হয়। আপনি যে দস্তাবেজগুলি নির্দেশ করেছেন সে হিসাবে স্কিমটি সেই পথটির যত্ন নেয়।
Roide

3

উপরের উত্তরের ভিত্তিতে আমি আপনার প্রকল্পের যে কোনও সংস্থার জন্য বৈধ উরি কীভাবে পেতে পারি তার একটি কোটলিন উদাহরণ ভাগ করতে চাই। আমি মনে করি এটি সর্বোত্তম সমাধান কারণ আপনার কোডটিতে আপনার কোনও স্ট্রিং টাইপ করতে হবে না এবং এটি ভুলভাবে টাইপ করার ঝুঁকি রয়েছে।

    val resourceId = R.raw.scannerbeep // r.mipmap.yourmipmap; R.drawable.yourdrawable
    val uriBeepSound = Uri.Builder()
        .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
        .authority(resources.getResourcePackageName(resourceId))
        .appendPath(resources.getResourceTypeName(resourceId))
        .appendPath(resources.getResourceEntryName(resourceId))
        .build()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.