2010-07-30 108 views
23

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

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是我给这个函数的示例输入。

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

我该如何加载图像以便通过URL从一个URL兼容?

回答

12

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

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

同样重要的是在用户代理添加,如Google图书拒绝访问,如果它不存在

5

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

+0

我似乎记得之前遇到过这个问题;我当时在1.5。 – I82Much 2010-07-31 04:04:57

41

位图是不是可绘制。如果你真的需要一个可绘制做到这一点:

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发现了尖)

+0

很好的答案,但请注意,构造函数已被弃用。使用BitmapDrawable(资源,位图)确保drawable已正确设置其目标密度 – avalancha 2015-11-11 08:21:28

+0

请编辑并修复它! – 2015-11-12 00:50:36

1

下面的代码对我的作品:

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); 
+1

这使我的应用程序崩溃 – Christopher 2013-01-15 10:42:26

+0

@Christopher - 崩溃如何 - 在主线程上联网? – 2014-09-17 21:58:42

1

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

AQuery aq = new AQuery(this); 
aq.id(view).image("http://yourserver/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你会得到访问,你可以包装为BitmapDrawable的位图。

+0

问题不在于此,请再阅读! – 2013-10-11 18:51:59

+0

请帮助我,我不明白为什么我的答案不适用于这里... – 2013-10-14 11:16:43

+0

该人要求某种方式来创建从网址drawable,你是一个正在做的下面,无法得到** drawable **;相反,你传递一个视图,并且图书馆将它从url下载的图像设置在它上面。那么如何才能将它视为问题的答案呢? – 2013-10-22 06:42:21