Я сталкиваюсь с той же проблемой здесь. Похоже, что Gingerbread (2.3) изменил способ обработки потоков GZipped. Просмотр символов «магический блок» показывает, что openStream () автоматически обнаруживает данные GZipped и запускает их через правильный потоковый декодер. Конечно, если вы попытаетесь запустить другой декодер GZIP в том же потоке, произойдет сбой с IOException.
Есть несколько способов справиться с этим. Первый способ - переключиться на HttpClient / HttpGet. НО нет гарантии, что это также не изменится в будущем. По сути, это взломать, чтобы заставить его работать снова. Более полное решение может быть сделано:
InputStream in = url.openStream();
GZIPInputStream zin;
try {
zin = (GZIPInputStream)in;
} catch (Exception e) {
zin = new GZIPInputStream(in);
}
В более старых версиях Android исключение срабатывает при попытке приведения, а в более новых версиях Android оно выполняется успешно. Злоупотребление обработчиком исключений таким способом не красиво, но работает.
Это, конечно, будет проблемой для базовых данных, сжатых или двоичных данных, которые выглядят как сжатые данные GZIP. Разработчики Android считают, что это изменение не является ошибкой:
http://code.google.com/p/android/issues/detail?id=16227
Я не согласен. Это серьезная поломка.