Android 使用getFileDescriptor加载映像的子采样版本时出现EBADF(错误文件号)

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

我试图在单个后台线程中使用AsyncTask执行以下代码。它给出了错误的文件号
在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;
    }