cara mendapatkan uri dari sumber gambar di android


96

Saya perlu membuka maksud untuk melihat gambar sebagai berikut:

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

Masalahnya adalah itu Uri uri = Uri.parse("@drawable/sample_1.jpg");tidak benar.

Jawaban:


138

Formatnya adalah:

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

[paket] adalah nama paket Anda

[res id] adalah nilai ID sumber daya, misalnya R.drawable.sample_1

untuk menjahitnya, gunakan

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


3
Jalur Uri = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); String mpath = path.toString (); Saya tidak mendapatkan file atau direktori kesalahan seperti itu ketika saya melakukan ini
hemanth kumar

4
ketika saya mencoba mengirim gambar sebagai lampiran email itu mengirim file tetapi tanpa ekstensi .jpg. Jadi gambar tidak valid di pc penerima.
ruben

@hemanthkumar Lihat jawaban ini sebagai referensi: stackoverflow.com/a/8476930/62921 Dia menjelaskan bahwa tidak ada folder drawable kecuali di komputer Anda. Itulah mengapa ia menggunakan ID dan path.toString () Anda tidak berfungsi.
ForceMagic

Ini tidak berhasil untuk saya. Saya mendapatkan ActivityNotFoundException. (android.content.ActivityNotFoundException: Tidak ada Aktivitas yang ditemukan untuk menangani Intent {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca

@LucioCrusca - mungkin Anda harus menentukan jenis maksud - apakah itu gambar jpeg atau png?
Axarydax

65

Berikut adalah solusi bersih yang sepenuhnya memanfaatkan android.net.Urikelas melalui Builderpolanya, menghindari komposisi berulang dan dekomposisi string URI, tanpa bergantung pada string kode keras atau ide ad hoc tentang sintaks 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();

ini memecahkan masalah saya. Bentuk uri saya seperti "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

Bagi mereka yang mengalami kesalahan, Anda mungkin memasukkan nama paket yang salah. Cukup gunakan metode ini.

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

Dimana

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

10
apakah Anda benar-benar membuat garis miring depan konstan ??
Sartheris Stormhammer

@SartherisStormhammer Ya :), meskipun saya biasanya menggunakan konstanta sistem untuk garis miring depan;)
sandalone

4

Anda menginginkan URI sumber daya gambar, dan R.drawable.goombmerupakan sumber daya gambar. Fungsi Builder membuat URI yang Anda minta:

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

Jadi Anda melewati sesuatu seperti "18" ke jalur. Itu sepertinya tidak benar
Nick Cardoso

@NickCardoso R.drawable.goomba adalah drawable yang saya miliki di folder resource saya. Jika nilainya 18, apakah itu membuat tugas menjadi salah?
roide

Tentu saja. developer.android.com/reference/android/net/… ID dalam file R perlu digunakan untuk menyelesaikan jalur yang sebenarnya.
Nick Cardoso

@NickCardoso terima kasih tetapi tidak dan berfungsi dengan sempurna. Skema menangani jalur tersebut seperti yang disarankan oleh dokumentasi yang Anda tunjukkan.
roide

3

Berdasarkan jawaban di atas, saya ingin membagikan contoh kotlin tentang cara mendapatkan Uri yang valid untuk sumber daya apa pun dalam proyek Anda. Saya pikir ini adalah solusi terbaik karena Anda tidak perlu mengetikkan string apa pun dalam kode Anda dan berisiko salah mengetiknya.

    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()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.