5

この IO 例外が発生する理由がわかりません。ドキュメントに記載されて"Throws IOException if the image format is not supported or can not be decoded."おり"he stream's position will be where ever it was after the encoded data was read. Currently only the JPEG and PNG formats are supported."、PNGを指定しています。使用して画像タイプを出力することもありbitmapOptions.outMimeType;image/png

コード :

    @Override
protected List<String> doInBackground(String... urlo) {
    List<String> savedKeys = new ArrayList<String>();
    InputStream inputStream = null;
    try {
        URL url = new URL("https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png");
           HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
           inputStream = connection.getInputStream();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   



    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
    bitmapOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(inputStream, null, bitmapOptions);
    int width = bitmapOptions.outWidth;
    int height = bitmapOptions.outHeight;
    String imageType = bitmapOptions.outMimeType;
    Debug.out(imageType);



    int block = 256;
    int count =0;
    BitmapRegionDecoder decoder = null;
    try {
        decoder = BitmapRegionDecoder.
            newInstance(inputStream, false);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Rect tileBounds = new Rect();
    // loop blocks
    for (int i=0; i<height; i+=block) {
        // get vertical bounds limited by image height
        tileBounds.top = i;
        int h = i+block<height ? block : height-i;
        tileBounds.bottom = i+h;
        tileBounds.right = 0;
        tileBounds.left = width;
        Debug.out(tileBounds.left+" "+tileBounds.right+" "+tileBounds.top+tileBounds.bottom);
            // load tile
        tile = decoder.decodeRegion(tileBounds, bitmapOptions);
        MainActivity.cache.put(key+count, tile);
          publishProgress();
          tile.recycle();
        savedKeys.add(key+count);

    }
    try {
        inputStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return savedKeys;

}
4

1 に答える 1

2

ファイルタイプが間違っているために例外がスローされるのではなく、ファイルが読み取れなかったためにスローされます。

BitmapFactory.decodeStream(inputStream, null, bitmapOptions); 

これはストリームを「トラバース」し、ストリーム オブジェクトは最初から開始されなくなります。

解決策は、この後に再度呼び出しinputStream = connection.getInputStream();て、ストリームを元の読み取り可能な状態に戻すことです。

于 2013-12-09T09:09:50.947 に答える