如何在Android中获取uri的图像资源


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");是不正确的。

Answers:


138

格式为:

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

[package]是您的包裹名称

[res id]是资源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扩展名。因此,该图像在收件人PC中无效。
鲁本

@hemanthkumar将此答案作为参考:stackoverflow.com/a/8476930/62921他解释说,除了您的计算机之外,没有可绘制的文件夹。这就是为什么它使用ID并且您的path.toString()不起作用的原因。
ForceMagic

这对我不起作用。我收到ActivityNotFoundException。(android.content.ActivityNotFoundException:无活动处理意向{行动= android.intent.action.VIEW DAT = android.resource://com.mypackage.myapp/2130837582} LG E400的Android 2.3.6。
卢西奥克鲁斯卡

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

这解决了我的问题。我的uri形状就像“ 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) );
    }

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,是否会使分配不正确?
罗德(Roide)'16

当然可以。developer.android.com/reference/android/net/…R文件中的ID必须用于解析真实路径。
尼克·卡多佐

@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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.