як отримати урі ресурсу зображення в 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");це неправильно.

Відповіді:


138

Формат:

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

[package] - назва вашого пакета

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

зшити його разом, використовувати

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


3
Шлях Uri = Uri.parse ("android.resource: //net.londatiga.android.twitpic/" + R.drawable.icon); Рядок mpath = path.toString (); Я не отримую такої помилки у файлі чи каталозі, коли я роблю це
hemanth kumar

4
коли я намагаюся надіслати зображення як вкладення електронної пошти, він надсилає файл, але без розширення .jpg. Таким чином, зображення недійсне в одержувачах ПК.
ruben

@hemanthkumar Дивіться цю відповідь як посилання: stackoverflow.com/a/8476930/62921 Він пояснює, що на вашій машині немає папки, що виводиться, окрім цього. Ось чому він використовує ідентифікатори, і що ваш path.toString () не працює.
ForceMagic

Це не працює для мене. Я отримую ActivityNotFoundException. (android.content.ActivityNotFoundException: Не знайдено жодної діяльності для обробки Intent {act = android.intent.action.VIEW dat = android.resource: //com.mypackage.myapp/2130837582}. LG E400 Android 2.3.6.
Lucio Crusca

@LucioCrusca - можливо, вам слід вказати тип наміру - це jpeg чи png зображення?
Аксарідакс

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();

це вирішило мою проблему. Моя форма урі нагадувала "android.resource: //com.craiovadata.guessthecountry/dravable/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

Для тих, хто має помилку, можливо, ви вводите неправильне ім’я пакета. Просто скористайтеся цим методом.

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
ти справді зробив константу для фореля?
Sartheris Stormhammer

@SartherisStormhammer Так :), хоча я зазвичай використовую системну константу для нахилу косу;)
sandalone

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, чи це робить завдання неправильним?
їхати

Звичайно. developer.android.com/reference/android/net/… Ідентифікатор у файлі R потрібно використовувати для вирішення реального шляху.
Нік Кардосо

@NickCardoso дякую, але це не так, і він працює чудово. Схема піклується про цей шлях, як пропонує документація, яку ви вказали.
їхати

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.