web-dev-qa-db-ja.com

Android URLからの描画可能な画像

現在、次のコードを使用して、描画可能なオブジェクトが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は、この機能を提供しているサンプル入力です。

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

URLから全面的に互換性のある方法で画像を読み込むにはどうすればよいですか?

自分で解決しました。次のコードを使用して、ビットマップとしてロードしました。

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ではありません。 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 にあるヒントを使用しました)

46
Felipe

よくわかりませんが、Drawable.createFromStream()は、ダウンロードされたInputStreamsではなく、ローカルファイルでの使用を目的としています。 BitmapFactory.decodeStream() を使用してから、戻りビットマップを BitmapDrawable でラップしてみてください。

5
Daniel Lew

URLからDrawableイメージを取得するには、AsyncTaskを使用してNetWorkOnMainThreadExceptionを回避し、onPostExecute()で取得したDrawableの結果を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
Jorgesys

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としてラップできるBitMapにアクセスできます。

1
Adriaan Koster

次のコードは私のために機能します:

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