BitmapFactory.decodeFile()在某些设备中返回null

时间:2017-11-20 11:02:40

标签: android bitmap bitmapfactory image-compression

我正在使用here中的以下代码。我想压缩图像。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeFile(filePath, options);

int actualHeight = options.outHeight;
int actualWidth = options.outWidth;

从相机,图库和照片中选择图像后,我会根据操作系统类型和设备型号在不同设备中获得不同类型的路径。像:

1)/ storage / emulated / 0 / Android / data /...

2)/raw//storage/emulated/0/mb/1511172993547.jpg

3)/ 2/1 / content:// media / external / images / media / 11647 / ORIGINAL / NONE / 486073582

如果path就像1st url,那么这段代码运行正常。但如果我得到其他类型的图像,那么BitmapFactory.decodeFile()给出null。

有没有办法在所有类型的设备和操作系统版本中压缩图像。

更新:

打开选择器:

Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");
startActivityForResult(pickIntent, 1001);

选择图片后:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Uri imgUri = Uri.fromFile(new File(data.getData().getPath()));
    Bitmap cmpBitmap = ImageUtils.compressUriQuality(OpenWallWeb.this, imgUri);
    dlgImageToPost.setImageBitmap(cmpBitmap);
...
}

压缩:

public static Bitmap compressUriQuality(Context mContext, Uri selectedImage) {
    InputStream imageStream = null;
    Bitmap bmp = null;
    try {
        imageStream = mContext.getContentResolver().openInputStream(
                selectedImage);
        bmp = BitmapFactory.decodeStream(imageStream);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 50, stream);

        if (imageStream != null)
            imageStream.close();
        stream.close();
        stream = null;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bmp;
}

2 个答案:

答案 0 :(得分:1)

电视2)/raw//storage/emulated/0/mb/1511172993547.jpg

如果用户从图库或照片中选择了图片,那么这不是您将获得的路径。当然,没有文件系统路径可以用于.decodeFile()。你是怎么得到它的?

3) /2/1/content://media/external/images/media/11647/ORIGINAL/NONE/486073582

这不是有效的内容方案路径。你是怎么得到它的?当然不能用于.decodeFile()。

  i'm getting different type of paths 

如果你的行为正常,你永远不会得到这样的道路。那么你在做什么呢?小学uri处理错误?

using following code from here. 

这是一个非常脏的示例代码,因为您现在已经意识到这一点很重要。

any way to compress image in all types of devices and OS versions.

当然。只需直接使用获得的选定uri即可。为它打开一个InputStream并改为使用.decodeStream()。

我的上帝......你没有直接使用uri。

 Bitmap cmpBitmap = ImageUtils.compressUriQuality(OpenWallWeb.this, imgUri);

更改为

  Bitmap cmpBitmap = ImageUtils.compressUriQuality(OpenWallWeb.this, data.getData());

答案 1 :(得分:0)

我遇到同样的问题,请为您的应用添加存储权限。

点击此链接了解更多信息

Storage permission error in Marshmallow