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.

pengguna602874
sumber

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

Axarydax.dll
sumber
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();
Uli
sumber
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) );
    }
xnagyg.dll
sumber
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 = "/";
sandalone
sumber
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();
roide
sumber
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()
Sergio
sumber