Bitmapfactory.decodeStream抛出FileNotFoundException

时间:2017-03-04 04:54:36

标签: android

我正在尝试从内部存储中保存和检索位图,但每次尝试加载位图时,BitMapFactory都会抛出异常:

BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: android.graphics.Bitmap@b35e414: open failed: ENOENT (No such file or directory)

我已经尝试过本网站上类似线程提供的几乎所有解决方案,但没有一个对我有用。 这个例外被抛出了4次,虽然我只读了一张图片。怎么样?

这是我用来保存和从存储中检索图像的代码。

public static void saveFile(Context context, Bitmap b, String picName) {
    FileOutputStream fos;
    try {
        fos = context.openFileOutput(picName, Context.MODE_PRIVATE);
        b.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.close();
    } catch (IOException e) {
        Log.e("store DRV image", e.getMessage());
        e.printStackTrace();
    }

}

public static Bitmap loadBitmap(Context context, String picName) {
    Bitmap b = null;
    FileInputStream fis;
    try {
        fis = context.openFileInput(picName);
        b = BitmapFactory.decodeStream(fis);
        fis.close();

    } catch (IOException e) {
        Log.e("get stored DRV image", e.getMessage());
        e.printStackTrace();
    }
    return b;
}

我从这个网站上的一个帖子中得到了这个代码,所有评论都很好。但它不适合我。我在Manifest中添加了权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

最后,我使用随机生成的UID作为文件名。 UID是使用Firebase SDK生成的。所以UID可能包含数字或其他字符 XXgKbRiS5ogQz1euqiyRsC1ggBS2。这是一个命名文件的错误方法吗?因此会抛出异常?

3 个答案:

答案 0 :(得分:1)

您需要添加6.0以上的用户权限:

Add library:
compile 'pub.devrel:easypermissions:0.2.1'

private String[] galleryPermissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

if (EasyPermissions.hasPermissions(this, galleryPermissions)) {
        pickImageFromGallery();
    } else {
        EasyPermissions.requestPermissions(this, "Access for storage",
                101, galleryPermissions);
    }

答案 1 :(得分:1)

在您的活动的onCreate()中添加此代码:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);

使用以下方法在同一活动中捕获结果:

    @Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {

        case 0: {

            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(getContext(), "Permission granted", Toast.LENGTH_SHORT).show();
                //call your method
            } else {
                Toast.makeText(getContext(), "Permission denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
 }

HERE

了解有关运行时权限的详情

答案 2 :(得分:0)

//确保授予权限     //用于保存

 File file=saveFile(contex,bitmap,picName);
    //For fetching
    File dir = new File(Environment.getExternalStorageDirectory(), picName);
    BitmapFactory.decodeFile(file.getPath())

 /**
     * @param context
     * @param b
     * @param picName
     */
    public static File saveFile(Context context, Bitmap b, String picName) {
        FileOutputStream fos;
        File dir = new File(Environment.getExternalStorageDirectory(), "My Images");
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File file = new File(dir, picName);
        try {
            fos = context.openFileOutput(file.getPath(), Context.MODE_PRIVATE);
            b.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.close();
        } catch (IOException e) {
            Log.e("store DRV image", e.getMessage());
            e.printStackTrace();
        }
        return file;
    }