我需要打开一个查看图像的意图如下:
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");
不正确。
答案 0 :(得分:132)
格式为:
"android.resource://[package]/[res id]"
[包]是您的包裹名称
[res id]是值资源ID,例如R.drawable.sample_1
将它拼接在一起,使用
Uri path = Uri.parse("android.resource://your.package.name/" + R.drawable.sample_1);
答案 1 :(得分:51)
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) );
}
答案 2 :(得分:48)
这是一个干净的解决方案,它通过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();
答案 3 :(得分:8)
对于有错误的人,您可能输入了错误的包名称。只需使用此方法。
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 = "/";
答案 4 :(得分:4)
您需要图像资源的URI,而R.drawable.goomb
是图像资源。 Builder函数创建您要求的URI:
String resourceScheme = "res";
Uri uri = new Uri.Builder()
.scheme(resourceScheme)
.path(String.valueOf(intResourceId))
.build();
答案 5 :(得分:1)
基于上述答案,我想分享一个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()