Рабочий код загрузки выдает сообщение «SocketException: программное обеспечение вызвало прерывание соединения» на устройAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Рабочий код загрузки выдает сообщение «SocketException: программное обеспечение вызвало прерывание соединения» на устрой

Сообщение Anonymous »

У меня есть приложение для Android, которое, помимо прочего, выполняет запросы к API и загружает файлы.
Оно загружает zip-файл с этим кодом, который никогда не вызывал проблем в предыдущих версиях Android (

Код: Выделить всё

downloadedFile
находится в личном хранилище):

Код: Выделить всё

        URL downloadUrl = new URL(downloadUrlS);
URLConnection connection = downloadUrl.openConnection();
connection.connect();

InputStream input = new BufferedInputStream(connection.getInputStream());
FileOutputStream output = new FileOutputStream(downloadedFile);

byte[] data = new byte[32768];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
output.write(data, 0, count);
}
output.flush();

output.close();
input.close();
К сожалению, начиная с Android 16, часто происходит сбой из-за исключения SocketException. Тот же APK работает правильно в более старых версиях в той же сети, где возникают проблемы с устройствами Android 16, поэтому это не проблема кода или проблема сети. Я думаю, что это какое-то изменение в политике подключения Android 16. Мы опробовали устройства Android 16 нескольких производителей, и, похоже, это затронуло все из них.
Код завершается с ошибкой, когда приложение вызывает функцию input.read(), вот стек ошибки:

Код: Выделить всё

java.net.SocketException: Software caused connection abort
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:118)
at java.net.SocketInputStream.read(SocketInputStream.java:173)
at java.net.SocketInputStream.read(SocketInputStream.java:143)
at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:994)
at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:958)
at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:873)
at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:846)
at com.android.okhttp.okio.Okio$2.read(Okio.java:138)
at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213)
at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:51)
at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:395)
at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:372)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:277)
at java.io.BufferedInputStream.read(BufferedInputStream.java:338)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
Размер полученного загруженного файла варьируется от нескольких килобайт до полного (он завершен только в 10% проб).
В журнале изменений я не нашел изменений в управлении соединением для Android 16, поэтому я попытался указать больше параметров, чтобы избежать тайм-аутов (в любом случае загрузка занимает 2-3 секунды) или проблем с поведением поддержания активности, но я получил то же исключение.

Код: Выделить всё

connection = (HttpURLConnection) downloadUrl.openConnection();
connection.setInstanceFollowRedirects(true);
connection.setConnectTimeout(15000);
connection.setReadTimeout(30000);
connection.setUseCaches(false);
connection.setRequestProperty("Accept-Encoding", "identity");
connection.setRequestProperty("Connection", "close");

connection.connect();
Есть ли у кого-нибудь решения или информация по этой проблеме? Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/798 ... tion-abort
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»