Android 使用getFileDescriptor加载映像的子采样版本时出现EBADF(错误文件号)
我试图在单个后台线程中使用AsyncTask执行以下代码。它给出了错误的文件号Android 使用getFileDescriptor加载映像的子采样版本时出现EBADF(错误文件号),android,multithreading,android-asynctask,android-contentprovider,file-descriptor,Android,Multithreading,Android Asynctask,Android Contentprovider,File Descriptor,我试图在单个后台线程中使用AsyncTask执行以下代码。它给出了错误的文件号 在google上搜索后,我发现不止一个线程试图同时访问或打开以下文件,但在我的场景中,只有一个后台线程使用asynctask运行。下面的decodeBitmapFromDescriptor方法是在SingleOne类中定义的 public Bitmap decodeBitmapFromDescriptor(Uri data, int reqWidth, int reqHeight) throws FileNotFou
在google上搜索后,我发现不止一个线程试图同时访问或打开以下文件,但在我的场景中,只有一个后台线程使用asynctask运行。下面的decodeBitmapFromDescriptor方法是在SingleOne类中定义的
public Bitmap decodeBitmapFromDescriptor(Uri data, int reqWidth, int reqHeight) throws FileNotFoundException {
FileDescriptor fileDescriptor= mContext.getContentResolver().
openFileDescriptor(data, "r").getFileDescriptor();
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bmp=BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
// it returns null don't know why ?? it works on api level 21
if(bmp==null){
bmp=BitmapFactory.decodeFileDescriptor(fileDescriptor);
}
return bmp;
}
以下是错误跟踪
java.io.IOException:读取失败:EBADF(错误文件号)05-13
11:16:04.652 17881-19663/com.spect.bosleo.spect W/System.err﹕ 在
libcore.io.IoBridge.read(IoBridge.java:442)05-13 11:16:04.652
17881-19663/com.spect.bosleo.spect W/System.err﹕ 在
读取(FileInputStream.java:179)05-13
11:16:04.652 17881-19663/com.spect.bosleo.spect W/System.err﹕ 在
java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:168)
05-13 11:16:04.652 17881-19663/com.spect.bosleo.spect W/System.err﹕
在java.io.BufferedInputStream.read处(BufferedInputStream.java:309)
05-13 11:16:04.652 17881-19663/com.spect.bosleo.spect W/System.err﹕
在android.graphics.BitmapFactory.NativeDecodeseam(本机方法)
05-13 11:16:04.652 17881-19663/com.spect.bosleo.spect W/System.err﹕
位于android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527)
05-13 11:16:04.652 17881-19663/com.spect.bosleo.spect W/System.err﹕
在
decodeFileDescriptor(BitmapFactory.java:626)
05-13 11:16:04.652 17881-19663/com.spect.bosleo.spect W/System.err﹕
在
decodeFileDescriptor(BitmapFactory.java:644)
注意:上面的代码在棒棒糖版本API21上正常工作,我刚刚处理完。
忘记关闭ParcelFileDescriptor
public Bitmap decodeBitmapFromDescriptor(Uri data,
int reqWidth, int reqHeight) throws IOException {
ParcelFileDescriptor ParcelFileDescriptor= mContext.getContentResolver().
openFileDescriptor(data, "r");
FileDescriptor fileDescriptor=ParcelFileDescriptor.getFileDescriptor();
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bmp=BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
// Here is the solution of my problem
ParcelFileDescriptor.close();
fileDescriptor=null;
// if(bmp==null){
// bmp=BitmapFactory.decodeFileDescriptor(fileDescriptor);
// }
return bmp;
}