获取存储在drawable中的图像的URI

我在我的应用程序中添加了几个示例项目,所以当用户第一次查看时,它看起来不是那么空。 包含示例项目的列表应该有一个图像,我要使用的图像已经存储在应用程序的/ res / drawable-folder中。

由于我已经有一个方法,加载从URI的项目图像我想要的URI到/res/drawable/myImage.jpg,但我似乎无法得到正确的。

stream程如下:使用表示图像URI的string创build项目。 将项目列表发送到列表该列表通过将string转换为URL,然后运行url.openStream()来加载后台任务中的图像。

我已经尝试了一些URI的选项没有任何成功。 “android.resource:// …..”表示未知协议“file://”找不到文件

所以现在我有点失去了如何解决这个问题..

您应该使用ContentResolver打开资源URI:

 Uri uri = Uri.parse("android.resource://your.package.here/drawable/image_name"); InputStream stream = getContentResolver().openInputStream(uri); 

您也可以使用此方法打开文件和内容URI。

 /** * get uri to drawable or any other resource type if u wish * @param context - context * @param drawableId - drawable res id * @return - uri */ public static final Uri getUriToDrawable(@NonNull Context context, @AnyRes int drawableId) { Uri imageUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.getResources().getResourcePackageName(drawableId) + '/' + context.getResources().getResourceTypeName(drawableId) + '/' + context.getResources().getResourceEntryName(drawableId) ); return imageUri; } 

基于以上调整版本的任何资源:

  /** * get uri to any resource type * @param context - context * @param resId - resource id * @throws Resources.NotFoundException if the given ID does not exist. * @return - Uri to resource by given id */ public static final Uri getUriToResource(@NonNull Context context, @AnyRes int resId) throws Resources.NotFoundException { /** Return a Resources instance for your application's package. */ Resources res = context.getResources(); /** * Creates a Uri which parses the given encoded URI string. * @param uriString an RFC 2396-compliant, encoded URI * @throws NullPointerException if uriString is null * @return Uri for this given uri string */ Uri resUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + res.getResourcePackageName(resId) + '/' + res.getResourceTypeName(resId) + '/' + res.getResourceEntryName(resId)); /** return uri */ return resUri; } 

一些信息:

 From the Java Language spec.: "17.5 Final Field Semantics ... when the object is seen by another thread, that thread will always see the correctly constructed version of that object's final fields. It will also see versions of any object or array referenced by those final fields that are at least as up-to-date as the final fields are." In that same vein, all non-transient fields within Uri implementations should be final and immutable so as to ensure true immutability for clients even when they don't use proper concurrency control. For reference, from RFC 2396: "4.3. Parsing a URI Reference A URI reference is typically parsed according to the four main components and fragment identifier in order to determine what components are present and whether the reference is relative or absolute. The individual components are then parsed for their subparts and, if not opaque, to verify their validity. Although the BNF defines what is allowed in each component, it is ambiguous in terms of differentiating between an authority component and a path component that begins with two slash characters. The greedy algorithm is used for disambiguation: the left-most matching rule soaks up as much of the URI reference string as it is capable of matching. In other words, the authority component wins." 

 3. URI Syntactic Components The URI syntax is dependent upon the scheme. In general, absolute URI are written as follows: <scheme>:<scheme-specific-part> An absolute URI contains the name of the scheme being used (<scheme>) followed by a colon (":") and then a string (the <scheme-specific-part>) whose interpretation depends on the scheme. The URI syntax does not require that the scheme-specific-part have any general structure or set of semantics which is common among all URI. However, a subset of URI do share a common syntax for representing hierarchical relationships within the namespace. This "generic URI" syntax consists of a sequence of four main components: <scheme>://<authority><path>?<query> 

来源:

争议

这个答案是正确的,但是关于最终领域的部分不是 – 与答案无关 – 鲍里斯·特雷霍夫Boris Treukhov)

@BorisTreukhov – 请详细说明你的意思是“关于最后的领域的部分是不正确的” – 问题 – 如何得到uri …? 构build它可以被parsing的方式(如何parsinguri?查看答案)

 package android.net; /** * Immutable URI reference. A URI reference includes a URI and a fragment, the * component of the URI following a '#'. Builds and parses URI references * which conform to * <a href="http://www.faqs.org/rfcs/rfc2396.html">RFC 2396</a>. * * <p>In the interest of performance, this class performs little to no * validation. Behavior is undefined for invalid input. This class is very * forgiving--in the face of invalid input, it will return garbage * rather than throw an exception unless otherwise specified. */ public abstract class Uri implements Parcelable, Comparable<Uri> { ... } 

这是你真正需要的:

  Uri imageUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getResources().getResourcePackageName(R.drawable.ic_launcher) + '/' + getResources().getResourceTypeName(R.drawable.ic_launcher) + '/' + getResources().getResourceEntryName(R.drawable.ic_launcher) );