BitmapFactory.decodeFile返回null

时间:2016-06-16 06:53:42

标签: android bitmap bitmapfactory

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

但是当我使用Bitmap获得bitmap = BitmapFactory.decodeFile()时,我会得到一个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);

......

当代码在最后一行运行时,我得到一个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

然后我在调试模式下运行我的代码,结果发现我从null方法获得了一个BitmapFactory.decodeFile对象。

参数imagePath

  

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

似乎没问题。

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

2 个答案:

答案 0 :(得分:4)

从代码中删除以下内容:

options.inJustDecodeBounds = true;

来自inJustDecodeBounds的文档:

  

如果设置为true,解码器将返回null (无位图),但是   out ...字段仍将设置,允许调用者查询   位图,而不必为其像素分配内存。

inJustDecodeBounds对于有效加载大Bitmap非常有用,因为您可以在不必为其分配内存的情况下读取其维度,尽管代码中没有任何用途。

答案 1 :(得分:0)

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

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

以下权限必须位于AndroidManifest.xml

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