Вот какая проблема была для меня:
В эмуляторе я бы сохранял файл jpg локально (на эмулируемой SD-карте), а затем пытался прочитать его и отобразить с помощью декодирования на эмуляторе, и это сработало. Затем, в качестве теста, я скопировал файл (используя adb pull) на мою машину для разработки (xp), и он отобразился бы с использованием 'paint'. Затем из эмулятора я загрузил файл (через сообщение http) на свой сервер win2003. Используя 'paint', он также отображается там. Но когда я загрузил его обратно в эмулятор (через http get), во время декодирования произошел сбой.
Тогда я заметил, что файл, загруженный на сервер win2003, был на два байта меньше исходного. Не совсем уверен, как это произошло, потому что я годами использовал одну и ту же логику загрузки и никогда раньше не замечал проблемы. В качестве теста я просто добавил еще два случайных байта во время загрузки, чтобы размер файла был точно таким же. Затем при загрузке обратно в эмулятор он декодируется и отображается правильно.
В качестве проверки я добавил два случайных байта в мои проекты xcode, а затем эти файлы jpg также отобразились в эмуляторе Android.
Итак, хотя файлы, которые были на два байта меньше, отображались повсюду, их не было на эмуляторе. Очевидно, что декодирование выполняет некую CRC до того, как оно пытается декодировать, и решает, что продолжить не может. И, следовательно, ошибка.