Je dois ouvrir l'intention de visualiser 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");
est incorrect.
Le format est:
"Android.resource://[package]/[res id]"
[paquet] est le nom de votre paquet
[id res] est valeur de l'identifiant de la ressource, par exemple. R.drawable.sample_1
pour coudre ensemble, utilisez
Uri path = Uri.parse("Android.resource://your.package.name/" + R.drawable.sample_1);
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) );
}
Voici une solution propre qui exploite pleinement le Android.net.Uri
classe via son modèle Builder
, en évitant la composition et la décomposition répétées de la chaîne d'URI, sans s'appuyer sur des chaînes codées en dur ou des idées ad hoc sur la syntaxe de l'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();
Pour ceux qui ont une erreur, vous entrez peut-être un nom de package incorrect. Utilisez simplement cette méthode.
public static Uri resIdToUri(Context context, int resId) {
return Uri.parse(Consts.Android_RESOURCE + context.getPackageName()
+ Consts.FORESLASH + resId);
}
Où
public static final String Android_RESOURCE = "Android.resource://";
public static final String FORESLASH = "/";
Vous voulez l'URI de la ressource image et R.drawable.goomb
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();
Sur la base des réponses ci-dessus, je souhaite partager un exemple Kotlin sur la façon d'obtenir un Uri valide pour toute ressource de votre projet. Je pense que c'est la meilleure solution car vous n'avez pas à taper de chaîne dans votre code et vous risquez de le taper à tort.
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()