BitmapFactory.decodeFile returns 空

BitmapFactory.decodeFile returns null

我要用Bitmap.compress()方法压缩图片。

但是当我使用 bitmap = BitmapFactory.decodeFile() 得到 Bitmap 时,我得到了一个 null 对象,并且该方法没有抛出任何异常。

这是我的代码

public static File compressImage(String imagePath) throws IOException {

    // Get bitmap
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);

    // Get bitmap output stream
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);

......

当最后一行的代码 运行s 我得到一个 NullPointerException :

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference

然后我 运行 我的代码处于调试模式,结果我从 BitmapFactory.decodeFile 方法得到了一个 null 对象。

参数imagePath

/storage/emulated/0/DCIM/Camera/IMG_20160610_195633.jpg

看起来还可以。

这段代码在另一个 activity 中运行良好,但是当我将它复制到我尝试压缩和上传图像的异步线程时,它崩溃了。这有没有可能是因为异步线程的事情?或者其他我没有注意到的东西?

从您的代码中删除以下内容:

options.inJustDecodeBounds = true;

来自 inJustDecodeBounds 的文档:

If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.

inJustDecodeBounds 对于高效加载大型 Bitmap 非常有用,因为您可以读取它们的尺寸而无需为它们分配内存,尽管它在您的代码中没有任何用途。

如果您使用通过 USB 连接的 phone 来调试代码,则此答案适用。我的 phone 表示 Android 版本 6.0.1。

我阅读了所有关于设置 "Uses-permission" 字段的帖子,但我的代码仍然无法正常工作。但是,我发现我需要在 "settings->device->applications->application manager" 下进入我的设备,然后单击我正在调试的应用程序并导航到 "Permissions" 并手动启用请求的权限。

以下权限必须在您的 AndroidManifest.xml

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