【问题标题】:EBADF (Bad file number) while loading subsampled version of image using getFileDescriptor使用 getFileDescriptor 加载图像的子采样版本时的 EBADF(错误文件号)
【发布时间】:2015-05-13 11:25:15
【问题描述】:

我尝试在单个后台线程中使用 AsyncTask 执行以下代码。它给出了错误的文件号
在谷歌上搜索后,我发现不止一个线程尝试同时访问或打开以下文件,但在我的场景中,只有一个后台线程正在使用 asynctask 运行。并且下面的 decodeBitmapFromDescriptor 方法是在 SinglTone 类中定义的。

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: read failed: EBADF (Bad file number) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err: at libcore.io.IoBridge.read(IoBridge.java:442) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕在 java.io.FileInputStream.read(FileInputStream.java:179) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err: at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:168) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 java.io.BufferedInputStream.read(BufferedInputStream.java:309) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:626) 05-13 11:16:04.652 17881-19663/com.espec.bosleo.espec W/System.err﹕ 在 android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:644) ....................................

注意:以上代码在 Lollipop 版本 API21 上正常工作

【问题讨论】:

    标签: android multithreading android-asynctask android-contentprovider file-descriptor


    【解决方案1】:

    我刚刚完成了它。 忘记关闭 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多