วิธีรับทรัพยากรรูปภาพใน Android


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]"

[package] คือชื่อแพ็คเกจของคุณ

[res id] คือค่าของ ID ทรัพยากรเช่น R.drawable.sample_1

เพื่อเย็บเข้าด้วยกันใช้

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


3
เส้นทาง Uri = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); สตริง mpath = path.toString (); ฉันไม่ได้รับข้อผิดพลาดของไฟล์หรือไดเรกทอรีดังกล่าวเมื่อฉันทำสิ่งนี้
hemanth kumar

4
เมื่อฉันพยายามส่งรูปภาพเป็นไฟล์แนบอีเมลมันกำลังส่งไฟล์ แต่ไม่มีนามสกุล. jpg ดังนั้นรูปภาพจึงไม่ถูกต้องในพีซีเครื่องรับ
ruben

@hemanthkumar ดูคำตอบนี้เป็นข้อมูลอ้างอิง: stackoverflow.com/a/8476930/62921เขาอธิบายว่าไม่มีโฟลเดอร์ที่วาดได้ยกเว้นในเครื่องของคุณ นั่นเป็นเหตุผลว่าทำไมจึงใช้ ID และ path.toString () ของคุณไม่ทำงาน
ForceMagic

สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันได้รับ ActivityNotFoundException (android.content.ActivityNotFoundException: ไม่พบกิจกรรมที่จัดการกับ Intent {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582} LG E400 Android 2.3.6
Lucio Crusca

@LucioCrusca - บางทีคุณควรระบุประเภทความตั้งใจ - มันเป็นภาพ jpeg หรือ png?
Axarydax

67

นี่คือโซลูชันที่สะอาดซึ่งใช้ประโยชน์จากandroid.net.Uriคลาสอย่างเต็มที่ผ่านBuilderรูปแบบโดยหลีกเลี่ยงการจัดองค์ประกอบซ้ำและการสลายตัวของสตริง URI โดยไม่ต้องอาศัยสตริงฮาร์ดโค้ดหรือแนวคิดเฉพาะกิจเกี่ยวกับไวยากรณ์ URI

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

สง่างามมากขึ้นเล็กน้อยด้วย Kotlin:

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

สิ่งนี้ช่วยแก้ปัญหาของฉันได้ รูปร่างอูริของฉันเหมือน "android.resource: //com.craiovadata.guessthecountry/drawable/sky"
Dan Alboteanu

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
คุณสร้างค่าคงที่สำหรับ foreslash จริง ๆ หรือไม่?
Sartheris Stormhammer

@SartherisStormhammer ใช่ :) แม้ว่าฉันมักจะใช้ค่าคงที่ของระบบสำหรับ foreslash;)
sandalone

4

คุณต้องการ URI ของทรัพยากรรูปภาพและR.drawable.goombเป็นทรัพยากรรูปภาพ ฟังก์ชัน Builder จะสร้าง URI ที่คุณต้องการ:

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

คุณกำลังผ่านบางอย่างเช่น "18" ไปยังเส้นทาง ดูเหมือนจะไม่ถูกต้อง
Nick Cardoso

@NickCardoso R.drawable.goomba คือสิ่งที่ดึงได้ที่ฉันมีในโฟลเดอร์ทรัพยากรของฉัน หากค่าเป็น 18 จะทำให้งานไม่ถูกต้องหรือไม่
roide

แน่นอนมันไม่ developer.android.com/reference/android/net/…ต้องใช้ ID ในไฟล์ R เพื่อแก้ไขเส้นทางจริง
Nick Cardoso

@NickCardoso ขอบคุณ แต่มันไม่ได้และทำงานได้อย่างสมบูรณ์ Scheme จะดูแลเส้นทางนั้นตามเอกสารที่คุณชี้ให้เห็น
roide

3

จากคำตอบข้างต้นฉันต้องการแบ่งปันตัวอย่าง kotlin เกี่ยวกับวิธีรับ Uri ที่ถูกต้องสำหรับทรัพยากรใด ๆ ในโครงการของคุณ ฉันคิดว่ามันเป็นทางออกที่ดีที่สุดเพราะคุณไม่ต้องพิมพ์สตริงใด ๆ ในโค้ดของคุณและเสี่ยงต่อการพิมพ์ผิด

    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.