come ottenere un uri di una risorsa immagine in Android


96

Devo aprire un intento per visualizzare un'immagine come segue:

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

Il problema è che Uri uri = Uri.parse("@drawable/sample_1.jpg");non è corretto.

Risposte:


138

Il formato è:

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

[pacchetto] è il nome del tuo pacchetto

[res id] è il valore dell'ID risorsa, ad esempio R.drawable.sample_1

per unirlo insieme, usa

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


3
Percorso Uri = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); String mpath = path.toString (); Non ottengo alcun errore di file o directory di questo tipo quando lo faccio
hemanth kumar

4
quando provo a inviare un'immagine come allegato e-mail, invia il file ma senza estensione .jpg. Quindi l'immagine non è valida nel pc dei destinatari.
ruben

@hemanthkumar Vedi questa risposta come riferimento: stackoverflow.com/a/8476930/62921 Spiega che non esiste una cartella disegnabile tranne che sulla tua macchina. Ecco perché usa gli ID e che il tuo path.toString () non funziona.
ForceMagic

Questo non funziona per me. Ottengo ActivityNotFoundException. (android.content.ActivityNotFoundException: Nessuna attività trovata per gestire Intent {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca

@ LucioCrusca - forse dovresti specificare il tipo di intento - è un'immagine jpeg o png?
Axarydax

65

Ecco una soluzione pulita che sfrutta completamente la android.net.Uriclasse tramite il suo Builderpattern, evitando la composizione e la scomposizione ripetute della stringa URI, senza fare affidamento su stringhe hard-coded o idee ad hoc sulla sintassi 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();

questo ha risolto il mio problema. La mia forma uri era come "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

Per coloro che hanno errori, potresti inserire il nome del pacchetto sbagliato. Usa questo metodo.

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

Dove

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

10
hai davvero creato una costante per un foreslash ??
Sartheris Stormhammer

@SartherisStormhammer Sì :), anche se di solito uso la costante di sistema per foreslash;)
sandalone

4

Vuoi l'URI della risorsa immagine ed R.drawable.goombè una risorsa immagine. La funzione Builder crea l'URI che stai chiedendo:

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

Quindi stai passando qualcosa come "18" al percorso. Sembra sbagliato
Nick Cardoso

@ NickCardoso R.drawable.goomba è il drawable che ho nella mia cartella delle risorse. Se il suo valore è 18, ciò rende l'assegnazione errata?
roide

Certo che lo fa. developer.android.com/reference/android/net/… L'ID nel file R deve essere utilizzato per risolvere un percorso reale.
Nick Cardoso

@ NickCardoso grazie ma non funziona e funziona perfettamente. Lo Schema si occupa di quel percorso come suggerisce la documentazione che hai indicato.
roide

3

Sulla base delle risposte sopra, voglio condividere un esempio di kotlin su come ottenere un Uri valido per qualsiasi risorsa nel tuo progetto. Penso che sia la soluzione migliore perché non devi digitare alcuna stringa nel codice e rischi di digitarla in modo errato.

    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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.