Android 读取AssetFileDescriptor时发生IOException

Android 读取AssetFileDescriptor时发生IOException,android,android-resources,android-assets,Android,Android Resources,Android Assets,我正在尝试使用以下代码从Android/assets文件夹读取位图: AssetFileDescriptor fd = getAssets().openFd("pic1.jpg") Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor()); 我收到的异常表明文件权限错误: java.io.IOException: read failed: EBADF (Bad file number) at l

我正在尝试使用以下代码从Android
/assets
文件夹读取位图:

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)
例外情况:

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)
例外情况:

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)

读取资产的正确方法是什么?

问题是我没有从主线程读取资产。在我开发的应用程序中,两个列表项可以同时加载相同的、相当大的资产


简言之,如果在另一个线程试图访问该文件时仍在读取该文件,则会抛出一个带有“lseek failed:EBADF(坏文件号)”的
IOException

试试
AssetFileDescriptor fd=getAssets().openFd(“/pics/”+assets[i])
,它抛出一个
FileNotFoundException
,这也是我在提供一个不存在的文件名时收到的结果;我将用堆栈跟踪更新问题。奇怪的是,在应用程序崩溃之前,资源确实出现了一段时间。我假设由于代码中其他地方的错误,资产试图被读取两次。我会简化事情,马上回来。@amal调试这个很头疼,所以我感觉到了你的痛苦。