Intereting Posts
Объяснение о controltransfer в android для настройки связи USB Android – Espresso – меню длинных опций – нажатие на пункт меню-опции, который не отображается @ В начале значения EditText Android Flip Animation Растут и исчезают изнутри, сжимаются и исчезают вокруг? Модернизация: обращение к объекту JSON, динамически изменяющее его имя Динамически добавлять TableRow в TableLayout Диалоговое окно с кнопкой и кнопкой подтверждения Вычесть режим смешивания с помощью ColorMatrixFilter в Android? Socket.io android java клиент получает сообщения и пример файла отправки Python на Android Возможно добавить заголовок раздела с сервера в списке со списком, чтобы удалить и отменить элемент Нарисуйте географически точную дугу на карте для Android Android Recyclerview Layoutmanager's onLayoutChildren вызывается при изменении содержимого элемента Как использовать тайм-аут ksoap в android? Как отправить POST в формате «multipart / form-data» в Android с помощью Volley

Передача больших объемов данных по bluetooth на Android Gingerbread

Я пытаюсь передать около мегабайта произвольных данных за раз от одного телефона Android до другого. В настоящее время я пишу размер, код команды и данные в DataOutputStream вокруг BufferedOutputStream , вокруг OutputStream возвращаемого из bluetoothSocketInstance.getOutputStream() .

Принимающий телефон считывает код размера и команды, а затем считывает из входного потока, пока он не получит все данные, которые он ожидает. Это работает для коротких строк, но для больших файлов не все данные передаются. Запуск приложения в отладчике показывает, что запись возвращается без каких-либо исключений, и чтение читает часть ожидаемых байтов, а затем блокирует неопределенно. Он также не исключает никаких исключений.

Есть ли где-то буфер, заполняющий? Есть ли что-то еще, что мне нужно сделать для обеспечения передачи всех данных?

Мой код для отправителя и получателя приведен ниже:

Отправитель:

  try { DataOutputStream d = new DataOutputStream(new BufferedOutputStream(mmOutStream,buffer.length+8)); //int b= buffer.length; d.writeInt(buffer.length); d.writeInt(command); d.write(buffer); d.flush(); } catch (IOException e) { Log.e(TAG, "Exception during write", e); } } 

Получатель:

  try { // Read from the InputStream int messageSize= inStream.readInt(); int messageCode = inStream.readInt(); bytes=0; buffer =new byte[messageSize]; while(bytes < messageSize) { bytes += inStream.read(buffer,bytes,messageSize - bytes); } message = bytes; } catch (IOException e) { Log.e(TAG, "disconnected", e); connectionLost(); break; } 

После некоторого тестирования на моем конце я изменил код отправки, чтобы выглядеть так:

 for(int i=0; i<buffer.length;i+=BIG_NUM) { int b = ((i+BIG_NUM) < buffer.length) ? BIG_NUM: buffer.length - i; d.write(buffer,i,b); d.flush(); } 

Теперь файлы отправляются. У кого-нибудь есть идея, почему? Выполняется ли вызов flush() до фактического переноса данных? Есть ли какая-либо документация о размере буферов отправки и получения, которые помогут мне решить, насколько я могу безопасно сделать BIG_NUM ?

У меня схожая проблема, при отправке файла отсутствуют некоторые части. Я пытаюсь BufferedOutputStream, но проблема все еще существует.

Наконец, я нахожу простое решение:

Вам не нужно отправлять длину буфера, просто разделить буфер отправки на байтовый массив (например, [8192]), а на стороне приема убедитесь, что этот буфер намного больше примерно в 4 или 8 раз, чем отправка буфера. Это сработало для меня, и файл отправлен.