Android Рисованные изображения из URL - PullRequest
26 голосов
/ 31 июля 2010

В настоящее время я использую следующий фрагмент кода для загрузки изображений, когда рисуемые объекты образуют 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-адреса?

Ответы [ 6 ]

45 голосов
/ 29 февраля 2012

Растровое изображение не является Drawable. Если вам действительно нужен 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(Resources.getSystem(), x);
}

(я использовал подсказку, найденную в https://stackoverflow.com/a/2416360/450148)

15 голосов
/ 03 августа 2010

Решил сам.Я загрузил его как растровое изображение, используя следующий код.

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 голосов
/ 31 июля 2010

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

1 голос
/ 07 мая 2019

Чтобы получить Drawable изображение из URL, вы должны использовать AsyncTask, чтобы избежать NetWorkOnMainThreadException, и результат Drawable, полученный в onPostExecute(), вы можете установить в ImageView:

    final String urlImage = "https://www.android.com/static/2016/img/hero-carousel/banner-android-p-2.jpg";

    new AsyncTask<String, Integer, Drawable>(){

        @Override
        protected Drawable doInBackground(String... strings) {
            Bitmap bmp = null;
            try {
                HttpURLConnection connection = (HttpURLConnection) new URL(urlImage).openConnection();
                connection.connect();
                InputStream input = connection.getInputStream();
                bmp = BitmapFactory.decodeStream(input);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return new BitmapDrawable(bmp);
        }

        protected void onPostExecute(Drawable result) {

            //Add image to ImageView
            myImageView.setImageDrawable(result);

        }


    }.execute();
1 голос
/ 15 июля 2013

Вы можете использовать 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, вы получите доступ к BitMap, который можно обернуть как BitmapDrawable.

1 голос
/ 30 октября 2012

У меня работает следующий код:

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