как получить uri ресурса изображения в android

96

Мне нужно открыть намерение для просмотра изображения следующим образом:

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");это неверно.

user602874
источник

Ответы:

138

Формат:

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

[пакет] - это имя вашего пакета

[res id] - это значение идентификатора ресурса, например R.drawable.sample_1

чтобы сшить, используйте

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

Axarydax
источник
3
Uri path = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); Строка mpath = path.toString (); Когда я делаю это, у меня нет такой ошибки файла или каталога
Хемант Кумар
4
когда я пытаюсь отправить изображение как вложение электронной почты, он отправляет файл, но без расширения .jpg. Таким образом, изображение недействительно на компьютере получателя.
Рубен
@hemanthkumar См. этот ответ как ссылку: stackoverflow.com/a/8476930/62921 Он объясняет, что нет папки с возможностью переноса, кроме как на вашем компьютере. Вот почему он использует идентификаторы и что ваш path.toString () не работает.
ForceMagic
У меня это не работает. Я получаю ActivityNotFoundException. (android.content.ActivityNotFoundException: не обнаружено действие для обработки намерения {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Лючио Круска
@LucioCrusca - может быть, вам следует указать тип намерения - это изображение jpeg или png?
Axarydax
65

Вот чистое решение, которое полностью использует 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();
Ули
источник
это решило мою проблему. Форма моего uri была похожа на "android.resource: //com.craiovadata.guessthecountry/drawable/sky"
Дэн Альботяну
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
источник
9

Для тех, у кого есть ошибка, вы можете ввести неправильное имя пакета. Просто воспользуйтесь этим методом.

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 = "/";
сандалон
источник
10
ты реально сделал константу для косой черты ??
Сартерис Штормхаммер,
@SartherisStormhammer Да :), хотя обычно я использую системную константу для косой черты;)
sandalone 07
4

Вам нужен URI ресурса изображения, и R.drawable.goombэто ресурс изображения. Функция Builder создает запрашиваемый URI:

String resourceScheme = "res";
Uri uri = new Uri.Builder()
  .scheme(resourceScheme)
  .path(String.valueOf(intResourceId))
  .build();
ездить
источник
Итак, вы передаете в путь что-то вроде «18». Это кажется неверным,
Ник Кардосо,
@NickCardoso R.drawable.goomba - это чертеж, который у меня есть в моей папке ресурсов. Если его значение равно 18, делает ли это присвоение неверным?
roide 09
Конечно, есть. developer.android.com/reference/android/net/… Идентификатор в файле R должен использоваться для определения реального пути.
Ник Кардосо,
@NickCardoso спасибо, но это не так, и он отлично работает. Схема заботится об этом пути, как предлагает указанная вами документация.
roide
3

Основываясь на ответах выше, я хочу поделиться примером 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()
Серджио
источник