एंड्रॉइड में एक छवि संसाधन का एक यूआरएल कैसे प्राप्त करें


96

मुझे एक इमेज देखने की मंशा इस प्रकार है:

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");गलत है।

जवाबों:


138

प्रारूप है:

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

[पैकेज] आपका पैकेज नाम है

[Res id] संसाधन ID का मान है , जैसे R.drawable.sample_1

इसे एक साथ सिलाई करने के लिए, उपयोग करें

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


3
उरी पथ = उरी.पारसे ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); स्ट्रिंग MPath = path.toString (); मुझे ऐसा कोई फ़ाइल या निर्देशिका त्रुटि नहीं मिलती है जब मैं यह कर रहा
हूं

4
जब मैं छवि को ईमेल अटैचमेंट के रूप में भेजने की कोशिश करता हूं तो यह फाइल भेज रहा है लेकिन बिना .jpg एक्सटेंशन के। इसलिए रसीद पीसी में छवि मान्य नहीं है।
रूबेन

@hemanthkumar इस उत्तर को एक संदर्भ के रूप में देखें: stackoverflow.com/a/8476930/62921 वह समझाता है कि आपकी मशीन के अलावा कोई भी आकर्षित करने योग्य फ़ोल्डर नहीं है। इसलिए यह आईडी का उपयोग करता है और आपके path.toString () काम नहीं करता है।
फोर्समैजिक

यह मेरे लिए काम नहीं करता है। मुझे ActivNotFoundException मिलती है। (android.content.ActivityNotFoundException कोई गतिविधि नहीं आशय को संभालने के लिए मिली {कार्य = android.intent.action.VIEW Dat = android.resource: //com.mypackage.myapp/2130837582} एलजी E400 एंड्रॉयड
लुसियो Crusca

@LucioCrusca - शायद आपको इरादा प्रकार निर्दिष्ट करना चाहिए - क्या यह jpeg या png छवि है?
Axarydax

65

यहां एक साफ समाधान है जो पूरी तरह android.net.Uriसे अपने Builderपैटर्न के माध्यम से कक्षा का लाभ उठाता है , यूआरआई स्ट्रिंग के बार-बार रचना और अपघटन से बचने के बिना, हार्ड-कोडेड स्ट्रिंग्स या यूआरआई सिंटैक्स के बारे में तदर्थ विचारों पर भरोसा किए बिना।

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

इससे मेरी समस्या हल हो गई। मेरा uri आकार "android.resource: //com.craiovadata.guessthecountry/drawable/sky" जैसा था
Dan Alboteanu

56
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
क्या तुमने वास्तव में एक पूर्वाभास के लिए एक निरंतरता बनाई है ??
Sartheris Stormhammer

@SartherisStormhammer हां :), हालांकि मैं आमतौर पर foreslash के लिए सिस्टम स्थिरांक का उपयोग करता हूं;)
सैंडलोन

4

आप छवि संसाधन का URI चाहते हैं, और R.drawable.goombएक छवि संसाधन है। बिल्डर फ़ंक्शन उस URI को बनाता है जो आप के लिए पूछ रहे हैं:

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

तो आप पथ के लिए "18" जैसे कुछ पास कर रहे हैं। यह गलत लगता है
निक कार्डसो

@NickCardoso R.drawable.goomba ड्रॉ करने योग्य है जो मेरे संसाधन फ़ोल्डर में है। यदि इसका मान 18 है, तो क्या यह असाइनमेंट गलत है?
21

बिलकुल यह करता है। developer.android.com/reference/android/net/… आर फ़ाइल में आईडी को वास्तविक पथ को हल करने के लिए उपयोग करने की आवश्यकता है।
निक कार्डसो

@NickCardoso धन्यवाद, लेकिन यह नहीं है और यह पूरी तरह से काम करता है। स्कीम उस पथ का ध्यान रखती है, जैसा कि आपके द्वारा बताए गए दस्तावेज़ से पता चलता है।
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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.