android'de bir görüntü kaynağının uri'si nasıl alınır


97

Bir resmi aşağıdaki gibi görüntülemek için bir niyet açmam gerekiyor:

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

Sorun şu ki Uri uri = Uri.parse("@drawable/sample_1.jpg");bu yanlış.

Yanıtlar:


139

Biçim şu şekildedir:

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

[paket], paketinizin adıdır

[res numarası] olduğu değeri , örneğin, R.drawable.sample_1 kaynak kimliği

birlikte dikmek için kullanın

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


3
Uri yolu = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); Dize mpath = yol.toString (); Bunu yaparken Böyle bir dosya veya dizin hatası
almıyorum

4
resmi e-posta eki olarak göndermeye çalıştığımda, dosyayı .jpg uzantısı olmadan gönderiyor. Yani görüntü alıcıların bilgisayarında geçerli değil.
ruben

@hemanthkumar Bu yanıtı referans olarak görün: stackoverflow.com/a/8476930/62921 Makineniz dışında çekilebilir bir klasör olmadığını açıkladı. Bu yüzden kimlikleri kullanır ve path.toString () işleviniz çalışmaz.
ForceMagic

Bu benim için çalışmıyor. ActivityNotFoundException alıyorum. (android.content.ActivityNotFoundException: Amacı işleyecek Etkinlik bulunamadı {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca

@LucioCrusca - belki amaç türünü belirlemelisiniz - jpeg mi yoksa png görüntüsü mü?
Axarydax

67

Burada, URI dizgisinin sabit kodlu dizelere veya geçici fikirlere dayanmadan, URI dizgisinin tekrarlanan bileşimini ve ayrışmasını önleyerek android.net.Uri, Builderkalıbı aracılığıyla sınıfı tamamen kullanan temiz bir çözüm var .

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 ile minimal daha zarif:

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

bu benim sorunumu çözdü. Benim uri şeklim "android.resource: //com.craiovadata.guessthecountry/drawable/sky" gibiydi
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

Hata yapanlar için yanlış paket adı giriyor olabilirsiniz. Sadece bu yöntemi kullanın.

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

Nerede

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

10
bir ön çizgi için gerçekten bir sabit mi yaptın ??
Sartheris Stormhammer

@SartherisStormhammer Evet :), genellikle ön çizgi için sistem sabiti kullansam da;)
sandalone

4

Görüntü kaynağının URI'sini istiyorsunuz ve R.drawable.goombbir görüntü kaynağıdır. Oluşturucu işlevi, istediğiniz URI'yi oluşturur:

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

Yani yola "18" gibi bir şey geçiyorsun. Bu yanlış görünüyor
Nick Cardoso

@NickCardoso R.drawable.goomba, kaynak klasörümde bulunan çekilebilir dosyadır. Değeri 18 ise, bu atamayı yanlış yapar mı?
roide

Tabii ki öyle. developer.android.com/reference/android/net/… Gerçek bir yolu çözmek için R dosyasındaki kimliğin kullanılması gerekir.
Nick Cardoso

@NickCardoso teşekkürler ama değil ve mükemmel çalışıyor. Şema, belirttiğiniz belgelerin önerdiği gibi bu yolu halleder.
roide

3

Yukarıdaki cevaplara dayanarak, projenizdeki herhangi bir kaynak için geçerli bir URI'nın nasıl alınacağına dair bir kotlin örneği paylaşmak istiyorum. Bunun en iyi çözüm olduğunu düşünüyorum çünkü kodunuzda herhangi bir dizge yazmak zorunda değilsiniz ve yanlış yazma riskiniz yok.

    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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.