2010-07-30 5 views
23

В настоящее время я использую следующий фрагмент кода для загрузки изображений в виде объектов с рисунком из URL.Android Drawable Images from 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 он выдает FileNotFoundException, когда я даю ему URL. В 2.2, учитывая тот же URL-адрес, он работает нормально. Следующий URL-адрес представляет собой образец ввода, который я предоставляю этой функции.

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

Как загрузить изображения в виде, совместимом по всем направлениям с 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); 
} 

Важно также, чтобы добавить в агент пользователя, поскольку googlebooks запрещает доступ, если он отсутствует

5

Я не уверен, но я думаю, что Drawable.createFromStream() больше предназначен для использования с локальными файлами, а не для загрузки InputStreams. Попробуйте использовать BitmapFactory.decodeStream(), затем оберните обратный битмап в BitmapDrawable.

+0

Я, кажется, помню, что сталкивался с этой проблемой раньше; В то время я был на 1,5. – I82Much

41

Bitmap не 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)

+0

Отличный ответ, но обратите внимание, что конструктор устарел. Используйте BitmapDrawable (Ресурсы, Растровое изображение), чтобы убедиться, что drawable правильно установил свою целевую плотность. – avalancha

+0

Пожалуйста, отредактируйте и исправьте! –

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

+0

@Christopher - сработает как - сеть в главной теме? –

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

Вопрос не в этом, пожалуйста, прочитайте еще раз! –

+0

Пожалуйста, помогите мне, я не понимаю, почему мой ответ здесь не применим ... –

+0

Человек попросил какой-то способ создать выталкиваемый из URL-адрес, ваш делает это внизу, никоим образом не может получить ** **; скорее вы передаете представление, и библиотека устанавливает изображение на нем, которое загружается с url.So, как это можно считать ответом на вопрос? –