来自URL的Android可绘制图片

我目前使用下面的一段代码来加载图像作为可绘制的对象形成一个URL。

Drawable drawable_from_url(String url, String src_name) throws java.net.MalformedURLException, java.io.IOException { return Drawable.createFromStream(((java.io.InputStream)new java.net.URL(url).getContent()), src_name); } 

此代码完全按照想要的工作,但似乎有兼容性问题。 在版本1.5中,当我给它一个URL时,它会引发FileNotFoundException 。 在2.2中,给定完全相同的URL,它工作正常。 下面的URL是我给这个函数的示例input。

 http://bks6.books.google.com/books?id=aH7BPTrwNXUC&printsec=frontcover&img=1&zoom=5&edge=curl&sig=ACfU3U2aQRnAX2o2ny2xFC1GmVn22almpg 

我如何以一种与URL兼容的方式加载图像?

Solutions Collecting From Web of "来自URL的Android可绘制图片"

位图不是可绘制的。 如果你确实需要一个Drawable,可以这样做:

 public static Drawable drawableFromUrl(String url) throws IOException { Bitmap x; HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.connect(); InputStream input = connection.getInputStream(); x = BitmapFactory.decodeStream(input); return new BitmapDrawable(x); } 

(我使用了https://stackoverflow.com/a/2416360/450148中的提示)

解决它自己。 我使用下面的代码作为位图加载它。

 Bitmap drawable_from_url(String url) throws java.net.MalformedURLException, java.io.IOException { HttpURLConnection connection = (HttpURLConnection)new URL(url) .openConnection(); connection.setRequestProperty("User-agent","Mozilla/4.0"); connection.connect(); InputStream input = connection.getInputStream(); return BitmapFactory.decodeStream(input); } 

添加用户代理也很重要,因为如果缺席,googlebooks将拒绝访问

我不确定,但我认为Drawable.createFromStream()更适合本地文件而不是下载的InputStreams。 尝试使用BitmapFactory.decodeStream() ,然后将返回位图包装在BitmapDrawable中 。

以下代码适用于我:

 Matrix Mat = new Matrix(); Bitmap Source = BitmapFactory.decodeFile("ItemImagePath"); Bitmap Destination = Bitmap.createScaledBitmap( Source, 320, 320, true ); Source = Bitmap.createBitmap( Destination, 0, 0, Destination.getWidth(), Destination.getHeight(),Mat, true ); ItemImageView.setImageBitmap(Source); 

你可以使用com.androidquery.AndroidQuery来做到这一点很简单。 例如:

 AQuery aq = new AQuery(this); aq.id(view).image("http://sofzh.miximages.com/android/yourimage.png", true, true, 300, new BitmapAjaxCallback() { @Override public void callback(String url, ImageView imageView, Bitmap bitmap, AjaxStatus status) { Drawable drawable = new BitmapDrawable(getResources(), bm); } }); 

如果您使用BitmapAjaxCallback,您将可以访问BitMap,您可以将其封装为BitmapDrawable。