Как получить URI ресурса изображения в Android
Мне нужно открыть намерение для просмотра изображения следующим образом:
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("@drawable/sample_1.jpg");
intent.setData(uri);
startActivity(intent);
Проблема в том, что Uri uri = Uri.parse("@drawable/sample_1.jpg");
это неверно.
8 ответов
Формат такой:
"android.resource://[package]/[res id]"
[пакет] - это название вашего пакета
[res id] является значением идентификатора ресурса, например, R.drawable.sample_1.
чтобы сшить это, используйте
Uri path = Uri.parse("android.resource://your.package.name/" + R.drawable.sample_1);
Вот чистое решение, которое полностью использует android.net.Uri
класс через его Builder
шаблон, избегая повторяющейся композиции и декомпозиции строки URI, не полагаясь на жестко закодированные строки или специальные идеи о синтаксисе 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();
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) );
}
Для тех, кто имеет ошибку, вы можете ввести неправильное имя пакета. Просто используйте этот метод.
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 = "/";
Основываясь на ответах выше, я хочу поделиться примером kotlin о том, как получить действительный Uri для любого ресурса в вашем проекте. Я думаю, что это лучшее решение, потому что вам не нужно вводить какие-либо строки в вашем коде и рисковать вводить его неправильно.
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()
Вы хотите URI ресурса изображения, и R.drawable.goomb
это ресурс изображения. Функция Builder создает URI, который вы запрашиваете:
String resourceScheme = "res";
Uri uri = new Uri.Builder()
.scheme(resourceScheme)
.path(String.valueOf(intResourceId))
.build();
Основываясь на ответе @xnagyg выше, я сделал удобное расширение, которое, надеюсь, будет полезно и для других,
fun Resources.getRawUri(@RawRes rawRes: Int) = "%s://%s/%s/%s".format(
ContentResolver.SCHEME_ANDROID_RESOURCE, this.getResourcePackageName(rawRes),
this.getResourceTypeName(rawRes), this.getResourceEntryName(rawRes)
)
который можно использовать как
context.resources.getRawUri(R.raw.rawid)
public static String getURIForResource (int resourceId) {
return Uri.parse("android.resource://"+BuildConfig.APPLICATION_ID+"/" +resourceId).toString();
}