comment obtenir un uri d'une ressource d'image dans Android

96

Je dois ouvrir une intention pour afficher une image comme suit:

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

Le problème est que Uri uri = Uri.parse("@drawable/sample_1.jpg");c'est incorrect.

user602874
la source

Réponses:

138

Le format est:

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

[package] est le nom de votre package

[res id] est la valeur de l'ID de la ressource, par exemple R.drawable.sample_1

pour le coudre ensemble, utilisez

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

Axarydax
la source
3
Uri path = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); Chaîne mpath = chemin.toString (); Je n'obtiens aucune erreur de fichier ou de répertoire de ce type lorsque je fais cela
Hemanth Kumar
4
quand j'essaye d'envoyer l'image comme pièce jointe d'email, il envoie le fichier mais sans l'extension .jpg. L'image n'est donc pas valide dans le PC des destinataires.
ruben
@hemanthkumar Voir cette réponse comme référence: stackoverflow.com/a/8476930/62921 Il explique qu'il n'y a pas de dossier pouvant être dessiné sauf sur votre machine. C'est pourquoi il utilise des identifiants et que votre chemin path.toString () ne fonctionne pas.
ForceMagic
Cela ne fonctionne pas pour moi. J'obtiens ActivityNotFoundException. (android.content.ActivityNotFoundException: Aucune activité trouvée pour gérer l'intention {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca
@LucioCrusca - peut-être devriez-vous spécifier le type d'intention - est-ce une image jpeg ou png?
Axarydax
65

Voici une solution propre qui exploite pleinement la android.net.Uriclasse via son Buildermodèle, évitant la composition et la décomposition répétées de la chaîne URI, sans compter sur des chaînes codées en dur ou des idées ad hoc sur la syntaxe 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
la source
cela a résolu mon problème. Ma forme d'URI était comme "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
la source
9

Pour ceux qui ont une erreur, vous entrez peut-être le mauvais nom de package. Utilisez simplement cette méthode.

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 = "/";
sandalone
la source
10
avez-vous vraiment fait une constante pour une barre oblique antérieure ??
Sartheris Stormhammer
@SartherisStormhammer Oui :), bien que j'utilise habituellement la constante système pour la barre oblique antérieure;)
sandalone
4

Vous voulez l'URI de la ressource image et R.drawable.goombc'est une ressource image. La fonction Builder crée l'URI que vous demandez:

String resourceScheme = "res";
Uri uri = new Uri.Builder()
  .scheme(resourceScheme)
  .path(String.valueOf(intResourceId))
  .build();
rouler
la source
Donc vous passez quelque chose comme "18" au chemin. Cela semble incorrect
Nick Cardoso
@NickCardoso R.drawable.goomba est le dessinable que j'ai dans mon dossier de ressources. Si sa valeur est 18, cela rend-il l'affectation incorrecte?
roide
Bien sûr que oui. developer.android.com/reference/android/net/… L'ID dans le fichier R doit être utilisé pour résoudre un chemin réel.
Nick Cardoso
@NickCardoso merci mais ça ne marche pas et ça marche parfaitement. Le Scheme s'occupe de ce chemin comme le suggère la documentation que vous avez indiquée.
roide
3

Sur la base des réponses ci-dessus, je souhaite partager un exemple de kotlin sur la façon d'obtenir un Uri valide pour n'importe quelle ressource de votre projet. Je pense que c'est la meilleure solution car vous n'avez pas à taper de chaînes dans votre code et vous risquez de le taper mal.

    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
la source