Я понимаю, что это на несколько месяцев позже, но я также столкнулся с этой проблемой с браузером Android и приложением Grails, над которым я работал.
Проблема заключается в том, как Android обрабатывает загружаемый контент и Androidинтеграция браузера с менеджером загрузок.
http://code.google.com/p/android/issues/detail?id=1978
http://code.google.com/p/android/issues/detail?id=18462
Я получил два запроса на стороне сервера для загружаемого файла;один из браузера и один из менеджера загрузки.Тот из браузера заканчивается, и сокет закрывается, как только браузер определяет, что это загружаемый контент.Затем браузер передает загрузку диспетчеру загрузки.
У меня также были проблемы с загрузкой, которая не удалась из диспетчера загрузки, но из-за этого я не отправлял заголовки, как только они были готовы.Я столкнулся с этим только с большими APK, маленькие APK (до 10-20K), казалось, загружались просто отлично.
Некоторый код может помочь:
response.contentType = 'application/vnd.android.package-archive'
response.addHeader('Content-Disposition', 'attachment; filename=FILENAME.APK')
// output file content
response.setStatus(200)
response.setContentLength("CONTENTSIZE")
// send headers
response.flushBuffer()
try {
response.outputStream << {FILE}.getBytes()
response.outputStream.flush()
} catch (SocketException e) {
log.error(e)
}
return
С этим я всегда получаюза исключением одного сокета.Не знаю, можно ли этого избежать, из какого-то быстрого поиска я не нашел способа определить состояние сокета по сервлету без простой попытки записи в сокет.