BitmapFactory.decodeFile возвращает значение null

Я собираюсь сжать изображение методом 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

что кажется в порядке.

Этот фрагмент кода хорошо работает в другом действии, но когда я копирую его в асинхронный поток, который я пытаюсь сжать и загрузить изображения, происходит сбой. Есть ли вероятность, что это связано с асинхронным потоком? Или я еще что-то не заметил?


person TimmyMa    schedule 16.06.2016    source источник


Ответы (2)


Удалите из кода следующее:

options.inJustDecodeBounds = true;

Из документации inJustDecodeBounds:

Если установлено значение true, декодер вернет null (без растрового изображения), но поля out... будут по-прежнему установлены, что позволит вызывающему объекту запрашивать растровое изображение без необходимости выделения памяти для его пикселей. .

inJustDecodeBounds полезен для эффективной загрузки больших Bitmap, так как вы можете считывать их размеры, не выделяя для них память, хотя это не имеет смысла в вашем коде.

person earthw0rmjim    schedule 16.06.2016

Этот ответ применим, если вы используете телефон, подключенный через USB, для отладки кода. На моем телефоне указана версия Android 6.0.1.

Я прочитал все сообщения о настройке полей «Использование-разрешение», и мой код все еще не работал. Однако я обнаружил, что мне нужно зайти на свое устройство в разделе «Настройки-> Устройство-> Приложения-> Диспетчер приложений», а затем щелкнуть приложение, которое я отлаживал, перейти к «Разрешениям» и вручную включить запрошенные разрешения.

Следующие разрешения должны быть в вашем AndroidManifest.xml.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
person Clark W    schedule 30.06.2016