2

画像のURLを指定して、ダウンロードしてImageViewに表示する必要があります。
画像が非常に大きく、OutOfMemoryExceptionがスローされる状況を除いて、すべてが正常に機能します。

うまくいけば、Androidのドキュメントがこの問題の解決策を提供します:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

私は、リソースではなく、InputStreamを受け入れるようにその切り取られたコードを適応させようとしました。
ただし、画像が表示されていないため、例外なく、そこに何かが欠けているようですが、LogCatに次のように表示されます:SkImageDecoder::Factoryがnullを返しました

画像をデコードして縮小する方法は次のとおりです(Androidのドキュメントに基づく)。

public static Bitmap decodeBitmapFromInputStream(InputStream inputStream,
            int reqWidth, int reqHeight) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(inputStream, null, options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeStream(inputStream, null, options);
    }

    public static int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float) height / (float) reqHeight);
            } else {
                inSampleSize = Math.round((float) width / (float) reqWidth);
            }
        }
        return inSampleSize;
    }

さて、私のビットマップダウンローダーメソッドでは、次のように呼び出します。

inputStream=entity.getContent();
return decodeBitmapFromInputStream(inputStream, 320, 480);

念のため、完全な方法を次に示します。

static Bitmap downloadBitmap(String url){
        AndroidHttpClient client=AndroidHttpClient.newInstance("Android");
        HttpGet getRequest=new HttpGet(url);

        try{
            HttpResponse response=client.execute(getRequest);
            int statusCode=response.getStatusLine().getStatusCode();

            if(statusCode!=HttpStatus.SC_OK){
                Log.d("GREC", "Error "+statusCode+" while retrieving bitmap from "+url);
                return null;
            }

            HttpEntity entity=response.getEntity();
            if(entity!=null){
                InputStream inputStream=null;
                try{
                    inputStream=entity.getContent();
                    return decodeBitmapFromInputStream(inputStream, 320, 480);
                }catch (Exception e) {
                    Log.d("GREC", "Exception occured in BitmapDownloader");
                    e.printStackTrace();
                }
                finally{
                    if(inputStream!=null){
                        inputStream.close();
                    }
                    entity.consumeContent();
                }
            }
        }catch (Exception e) {
            getRequest.abort();
            Log.d("GREC", "Error while retriving bitmap from "+url+", "+e.toString());
        }finally{
            if(client!=null){
                client.close();
            }
        }
        return null;
    }
4

1 に答える 1

0

問題は、一度 HttpUrlConnection から InputStream を使用すると、巻き戻して同じ InputStream を再度使用することができないことでした。したがって、画像の実際のサンプリング用に新しい InputStream を作成する必要があります。それ以外の場合は、http 要求を中止する必要があります。decodeStream が null を返すを参照してください

于 2012-10-09T08:33:19.347 に答える