2016-06-16 2 views
4

Я собираюсь сжать изображение с помощью метода Bitmap.compress().BitmapFactory.decodeFile возвращает null

Но когда я получаю 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

, который, кажется, хорошо.

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

ответ

4

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

options.inJustDecodeBounds = true; 

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

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

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

0

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

Я прочитал все сообщения о настройке полей «Разрешения на использование» и мой код все еще не работал. Однако я обнаружил, что мне нужно войти в мое устройство под «settings-> device-> applications-> application manager», а затем щелкнуть приложение, которое я отлаживал, и перейти к «Разрешениям» и вручную включить запрашиваемые разрешения.

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
Смежные вопросы