2

/assets次のコードを使用して、Androidフォルダーからビットマップを読み取ろうとしています。

AssetFileDescriptor fd = getAssets().openFd("pic1.jpg")
Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor());

私が得ている例外は、ファイルのパーミッションが間違っていることを示唆しています:

java.io.IOException: read failed: EBADF (Bad file number)
    at libcore.io.IoBridge.read(IoBridge.java:432)
    at java.io.FileInputStream.read(FileInputStream.java:179)
    at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:168)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:309)
    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
    at android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:670)
    at android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:688)

入力ストリームから読み取ろうとすると、同様の例外が発生します。

AssetFileDescriptor fd = getAssets().openFd("pic1.jpg");
FileInputStream is = fd.createInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);

例外:

java.io.IOException: lseek failed: EBADF (Bad file number)
Stack trace:
  at java.io.FileInputStream.skip(FileInputStream.java:197)
  at android.content.res.AssetFileDescriptor$AutoCloseInputStream.<init>(AssetFileDescriptor.java:173)
  at android.content.res.AssetFileDescriptor.createInputStream(AssetFileDescriptor.java:138)

入力ストリームから直接読み取ると、さらに別の例外が発生します。

InputStream is = getAssets().open("pic1.jpg");
Bitmap bitmap = BitmapFactory.decodeStream(is);

例外:

java.lang.NullPointerException: asset
  at android.content.res.AssetManager.seekAsset(Native Method)
  at android.content.res.AssetManager.access$600(AssetManager.java:35)
  at android.content.res.AssetManager$AssetInputStream.mark(AssetManager.java:567)
  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:572)
  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:643)

アセットを読み取る正しい方法は何ですか?

4

1 に答える 1

6

問題は、メインスレッドからアセットを読み取っていなかったことです。私が開発していたアプリケーションでは、2つのリストアイテムが同じ、かなり大きなアセットを同時にロードできました。

つまり、別のスレッドがファイルにアクセスしようとしたときにそのファイルがまだ読み取られていた場合、IOException「lseek failed:EBADF(Bad filenumber)」でスローされます。

于 2013-01-05T00:56:53.153 に答える