Хорошо, я нашел проблему. Я полностью виноват ...
Как я читал поток:
while(true){
int bytesRead = stream.read(tmpBuffer);
// if -1, EOF
if(bytesRead < 0)
break;
(...)
// WRONG LOGIC !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// if we read the last chunk of data, and found EOF
if(bytesRead < tmpBufferArrayLength)
break;
// WRONG LOGIC !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
См. Часть между "неправильной логикой !!!" Комментарии? Я предполагал, что если read (tmpBuffer) не может полностью заполнить буфер tmp, то это потому, что достигается EOF. API вовсе не гарантирует этого: он просто заявляет, что EOF сигнализируется чтением (tmpBuffer), возвращающим -1.
Я не видел этого раньше, потому что все мобильные телефоны (и emulatores), которые я тестировал, могли полностью заполнять буфер при каждом вызове.