Ошибка чтения, возможно, сокет закрыт или истекло время ожидания, чтение ret: -1 android 13 ⇐ Android
-
Anonymous
Ошибка чтения, возможно, сокет закрыт или истекло время ожидания, чтение ret: -1 android 13
Я пытаюсь создать соединение Bluetooth.
Я могу искать устройства поблизости, но при попытке подключения получаю непонятную ошибку:
ошибка ниже при соединении
connect_error, чтение не выполнено, возможно, сокет закрыт или истекло время ожидания, чтение ret: -1, java.io.IOException: чтение не выполнено, возможно, сокет закрыт или истекло время ожидания, чтение ret: -1
BluetoothPrintService.java
import android.bluetooth.BluetoothAdapter; импортировать android.bluetooth.BluetoothDevice; импортировать android.bluetooth.BluetoothSocket; импортировать android.content.Context; импортировать android.os.Bundle; импортировать android.os.Handler; импортировать android.os.Message; импортировать android.util.Log; импортировать java.io.IOException; импортировать java.io.InputStream; импортировать java.io.OutputStream; импортировать java.util.Arrays; импортировать java.util.UUID; /** * Этот класс выполняет всю работу по настройке и управлению соединениями Bluetooth с принтерами. * Имеет резьбу для подключения к принтеру и резьбу для передачи данных при подключении. */ общественный класс BluetoothPrintService { // Отладка частная статическая окончательная строка TAG = «BluetoothPrintService»; частный статический окончательный логический D = true; // Уникальный UUID для этого приложения частный статический окончательный UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // Поля участников частный окончательный адаптер BluetoothAdapter; частный финальный обработчик mHandler; частный int mState; частный ConnectThread mConnectThread; частный ConnectedThread mConnectedThread; // Константы, указывающие текущее состояние соединения общедоступный статический финал int STATE_NONE = 0; // мы ничего не делаем публичный статический финал int STATE_LISTEN = 1; // теперь прослушиваем входящие соединения общедоступный статический окончательный интервал STATE_CONNECTING = 2; // сейчас инициируем исходящее соединение общедоступный статический окончательный интервал STATE_CONNECTED = 3; // теперь подключено к удаленному устройству /** * Конструктор. Готовит новый сеанс Bluetooth. * @param context Контекст активности пользовательского интерфейса * @param handler Обработчик для отправки сообщений обратно в действие пользовательского интерфейса. */ public BluetoothPrintService (контекст контекста, обработчик обработчика) { mAdapter = BluetoothAdapter.getDefaultAdapter(); mState = STATE_NONE; мХандлер = обработчик; } /** * Установить текущее состояние соединения * @param state Целое число, определяющее текущее состояние соединения. */ частная синхронизированная пустота setState (int state) { if (D) Log.d(TAG, "setState() " + mState + " -> " + state); mState = состояние; } /** * Возврат текущего состояния соединения. */ общедоступный синхронизированный int getState() { вернуть mState; } /** * Запустите службу печати. Вызывается действием onResume() */ общедоступный синхронизированный недействительный старт () { if (D) Log.d(TAG, "старт"); // Отменяем любой поток, пытающийся установить соединение если (mConnectThread! = ноль) { mConnectThread.cancel(); mConnectThread = ноль; } // Отмена любого потока, в котором в данный момент установлено соединение если (mConnectedThread! = ноль) { mConnectedThread.cancel(); mConnectedThread = ноль; } setState (STATE_LISTEN); } /** * Запустите ConnectThread, чтобы инициировать соединение с удаленным устройством. * @param устройство Bluetooth-устройство для подключения. * @param secure Тип безопасности сокета — Безопасный (true), Небезопасный (false) */ общедоступная синхронизированная недействительная связь (устройство BluetoothDevice, логическое значение Secure) { if (D) Log.d(TAG, «подключиться к:» + устройство); // Отменяем любой поток, пытающийся установить соединение если (mState == STATE_CONNECTING) { если (mConnectThread! = ноль) { mConnectThread.cancel(); mConnectThread = ноль; } } // Отмена любого потока, в котором в данный момент установлено соединение если (mConnectedThread! = ноль) { mConnectedThread.cancel(); mConnectedThread = ноль; } // Запускаем поток для подключения к данному устройству mConnectThread = новый ConnectThread (устройство, безопасное); mConnectThread.start(); setState (STATE_CONNECTING); } /** * Запустите ConnectedThread, чтобы начать управление соединением Bluetooth. * @param Socket Bluetooth-сокет, через который было установлено соединение. * @param device Подключенное устройство Bluetooth. */ общедоступная синхронизированная пустота подключена (сокет BluetoothSocket, устройство BluetoothDevice, окончательная строка socketType) { if (D) Log.d(TAG, «подключено, Тип сокета:» + Тип сокета); // Отменяем поток, завершивший соединение если (mConnectThread! = ноль) { mConnectThread.cancel(); mConnectThread = ноль; } // Отмена любого потока, в котором в данный момент установлено соединение если (mConnectedThread! = ноль) { mConnectedThread.cancel(); mConnectedThread = ноль; } // Запускаем поток для управления соединением и выполнения передачи mConnectedThread = новый ConnectedThread (сокет, тип сокета); mConnectedThread.start(); // Отправляем имя подключенного устройства обратно в действие пользовательского интерфейса Сообщение msg = mHandler.obtainMessage(WoosimPrnMng.MESSAGE_DEVICE_NAME); Bundle Bundle = новый Bundle(); Bundle.putString(WoosimPrnMng.DEVICE_NAME, device.getName()); msg.setData(пакет); mHandler.sendMessage(msg); setState(STATE_CONNECTED); } /** * Остановить все потоки */ общедоступная синхронизированная недействительная остановка () { if (D) Log.d(TAG, «стоп»); если (mConnectThread! = ноль) { mConnectThread.cancel(); mConnectThread = ноль; } если (mConnectedThread! = ноль) { mConnectedThread.cancel(); mConnectedThread = ноль; } setState (STATE_NONE); } /** * Запись в ConnectedThread несинхронизированным способом. * @param out Байты для записи * @see ConnectedThread#write(byte[]) */ public void write(byte[] out) { // Создаём временный объект ConnectedThread r; // Синхронизируем копию ConnectedThread синхронизировано (это) { если (mState!= STATE_CONNECTED) return; г = mConnectedThread; } // Выполняем запись несинхронизировано r.write(выход); } /** * Укажите, что попытка подключения не удалась, и уведомите об этом действие пользовательского интерфейса. */ частное недействительное соединениеFailed() { // Когда приложение будет уничтожено, просто вернёмся если (mState == STATE_NONE) возврат; // Отправляем сообщение об ошибке обратно в Activity Сообщение сообщения = mHandler.obtainMessage(WoosimPrnMng.MESSAGE_TOAST); Bundle Bundle = новый Bundle(); Bundle.putInt(WoosimPrnMng.TOAST, R.string.connect_fail); msg.setData(пакет); mHandler.sendMessage(msg); // Запускаем службу заново, чтобы перезапустить режим прослушивания BluetoothPrintService.this.start(); } /** * Укажите, что соединение потеряно, и уведомите об активности пользовательского интерфейса. */ частное недействительное соединениеLost() { // Когда приложение будет уничтожено, просто вернёмся если (mState == STATE_NONE) возврат; // Отправляем сообщение об ошибке обратно в Activity Сообщение сообщения = mHandler.obtainMessage(WoosimPrnMng.MESSAGE_TOAST); Bundle Bundle = новый Bundle(); Bundle.putInt(WoosimPrnMng.TOAST, R.string.connect_lost); msg.setData(пакет); mHandler.sendMessage(msg); // Запускаем службу заново, чтобы перезапустить режим прослушивания BluetoothPrintService.this.start(); } /** * Этот поток запускается при попытке установить исходящее соединение. * с устройством. Он проходит прямо насквозь; связь либо * успешный или неудачный. */ частный класс ConnectThread расширяет поток { частный окончательный BluetoothSocket mmSocket; частный окончательный BluetoothDevice mmDevice; частная строка mSocketType; public ConnectThread (устройство BluetoothDevice, логическое значение Secure) { ммДевице = устройство; BluetoothSocket tmp = ноль; мсокеттипе = безопасный? «Безопасно»: «Небезопасно»; // Получаем BluetoothSocket для соединения с // задано BluetoothDevice пытаться { если (безопасно) { tmp = device.createRfcommSocketToServiceRecord(SPP_UUID); } еще { tmp = device.createInsecureRfcommSocketToServiceRecord(SPP_UUID); } } catch (IOException e) { Log.e(TAG, "Тип сокета: " + mSocketType + "сбой создания()", e); } ммсокет = ТМП; } общественный недействительный запуск () { Log.i(TAG, "BEGIN mConnectThread SocketType:" + mSocketType); setName("ConnectThread" + mSocketType); // Всегда отменяйте обнаружение, поскольку это замедлит соединение mAdapter.cancelDiscovery(); // Подключаемся к BluetoothSocket пытаться { // Это блокирующий вызов, который возвращается только при // успешное соединение или исключение ммSocket.connect(); } catch (IOException e) { // Закрываем сокет пытаться { ммсокет.закрыть(); } поймать (IOException e2) { Log.e(TAG, "невозможно закрыть() " + mSocketType + " сокет при сбое соединения", e2); } Log.e(TAG, «Ошибка соединения», e); соединение не удалось(); возвращаться; } // Сбрасываем ConnectThread, потому что все готово синхронизировано (BluetoothPrintService.this) { mConnectThread = ноль; } // Запускаем подключенный поток подключен (mmSocket, mmDevice, mSocketType); } общественная недействительная отмена () { пытаться { ммсокет.закрыть(); } catch (IOException e) { Log.e(TAG, "close() of Connect" + mSocketType + "Ошибка сокета", e); } } } /** * Этот поток запускается во время соединения с удаленным устройством. * Он обрабатывает все входящие и исходящие передачи. */ частный класс ConnectedThread расширяет поток { частный окончательный BluetoothSocket mmSocket; частный окончательный InputStream mmInStream; частный окончательный OutputStream mmOutStream; public ConnectedThread (сокет BluetoothSocket, StringocketType) { Log.d(TAG, "создать ConnectedThread: " + тип сокета); ммSocket = сокет; Входной поток tmpIn = ноль; Выходной поток tmpOut = ноль; // Получаем потоки ввода и вывода BluetoothSocket пытаться { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { Log.e(TAG, «временные сокеты не созданы», e); } ммВход = tmpIn; ммOutStream = tmpOut; } общественный недействительный запуск () { Log.i(TAG, "BEGIN mConnectedThread"); буфер байт[] = новый байт[1024]; целые байты; // Продолжаем слушать InputStream при подключении в то время как (истина) { пытаться { // Читаем из входного потока байты = mmInStream.read(буфер); // буфер может быть перезаписан данными следующего входного потока, поэтому его следует скопировать byte[] rcvData = новый байт[байты]; rcvData = Arrays.copyOf(буфер, байты); // Отправляем полученные байты в UI Activity mHandler.obtainMessage(WoosimPrnMng.MESSAGE_READ, bytes, -1, rcvData).sendToTarget(); } catch (IOException e) { Log.e(TAG, «Соединение потеряно», e); соединение потеряно(); перерыв; } } } /** * Запись в подключенный OutStream. * @param buffer Байты для записи */ общественная недействительная запись (буфер байта []) { пытаться { ммOutStream.write(буфер); } catch (IOException e) { Log.e(TAG, «Исключение при записи», e); } } общественная недействительная отмена () { пытаться { ммВПотоке.закрыть(); ммOutStream.закрыть(); ммсокет.закрыть(); } catch (IOException e) { Log.e(TAG, «Ошибка закрытия() сокета подключения», e); } } } } Выдает ошибку при connectionFailed
Я пытаюсь создать соединение Bluetooth.
Я могу искать устройства поблизости, но при попытке подключения получаю непонятную ошибку:
ошибка ниже при соединении
connect_error, чтение не выполнено, возможно, сокет закрыт или истекло время ожидания, чтение ret: -1, java.io.IOException: чтение не выполнено, возможно, сокет закрыт или истекло время ожидания, чтение ret: -1
BluetoothPrintService.java
import android.bluetooth.BluetoothAdapter; импортировать android.bluetooth.BluetoothDevice; импортировать android.bluetooth.BluetoothSocket; импортировать android.content.Context; импортировать android.os.Bundle; импортировать android.os.Handler; импортировать android.os.Message; импортировать android.util.Log; импортировать java.io.IOException; импортировать java.io.InputStream; импортировать java.io.OutputStream; импортировать java.util.Arrays; импортировать java.util.UUID; /** * Этот класс выполняет всю работу по настройке и управлению соединениями Bluetooth с принтерами. * Имеет резьбу для подключения к принтеру и резьбу для передачи данных при подключении. */ общественный класс BluetoothPrintService { // Отладка частная статическая окончательная строка TAG = «BluetoothPrintService»; частный статический окончательный логический D = true; // Уникальный UUID для этого приложения частный статический окончательный UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // Поля участников частный окончательный адаптер BluetoothAdapter; частный финальный обработчик mHandler; частный int mState; частный ConnectThread mConnectThread; частный ConnectedThread mConnectedThread; // Константы, указывающие текущее состояние соединения общедоступный статический финал int STATE_NONE = 0; // мы ничего не делаем публичный статический финал int STATE_LISTEN = 1; // теперь прослушиваем входящие соединения общедоступный статический окончательный интервал STATE_CONNECTING = 2; // сейчас инициируем исходящее соединение общедоступный статический окончательный интервал STATE_CONNECTED = 3; // теперь подключено к удаленному устройству /** * Конструктор. Готовит новый сеанс Bluetooth. * @param context Контекст активности пользовательского интерфейса * @param handler Обработчик для отправки сообщений обратно в действие пользовательского интерфейса. */ public BluetoothPrintService (контекст контекста, обработчик обработчика) { mAdapter = BluetoothAdapter.getDefaultAdapter(); mState = STATE_NONE; мХандлер = обработчик; } /** * Установить текущее состояние соединения * @param state Целое число, определяющее текущее состояние соединения. */ частная синхронизированная пустота setState (int state) { if (D) Log.d(TAG, "setState() " + mState + " -> " + state); mState = состояние; } /** * Возврат текущего состояния соединения. */ общедоступный синхронизированный int getState() { вернуть mState; } /** * Запустите службу печати. Вызывается действием onResume() */ общедоступный синхронизированный недействительный старт () { if (D) Log.d(TAG, "старт"); // Отменяем любой поток, пытающийся установить соединение если (mConnectThread! = ноль) { mConnectThread.cancel(); mConnectThread = ноль; } // Отмена любого потока, в котором в данный момент установлено соединение если (mConnectedThread! = ноль) { mConnectedThread.cancel(); mConnectedThread = ноль; } setState (STATE_LISTEN); } /** * Запустите ConnectThread, чтобы инициировать соединение с удаленным устройством. * @param устройство Bluetooth-устройство для подключения. * @param secure Тип безопасности сокета — Безопасный (true), Небезопасный (false) */ общедоступная синхронизированная недействительная связь (устройство BluetoothDevice, логическое значение Secure) { if (D) Log.d(TAG, «подключиться к:» + устройство); // Отменяем любой поток, пытающийся установить соединение если (mState == STATE_CONNECTING) { если (mConnectThread! = ноль) { mConnectThread.cancel(); mConnectThread = ноль; } } // Отмена любого потока, в котором в данный момент установлено соединение если (mConnectedThread! = ноль) { mConnectedThread.cancel(); mConnectedThread = ноль; } // Запускаем поток для подключения к данному устройству mConnectThread = новый ConnectThread (устройство, безопасное); mConnectThread.start(); setState (STATE_CONNECTING); } /** * Запустите ConnectedThread, чтобы начать управление соединением Bluetooth. * @param Socket Bluetooth-сокет, через который было установлено соединение. * @param device Подключенное устройство Bluetooth. */ общедоступная синхронизированная пустота подключена (сокет BluetoothSocket, устройство BluetoothDevice, окончательная строка socketType) { if (D) Log.d(TAG, «подключено, Тип сокета:» + Тип сокета); // Отменяем поток, завершивший соединение если (mConnectThread! = ноль) { mConnectThread.cancel(); mConnectThread = ноль; } // Отмена любого потока, в котором в данный момент установлено соединение если (mConnectedThread! = ноль) { mConnectedThread.cancel(); mConnectedThread = ноль; } // Запускаем поток для управления соединением и выполнения передачи mConnectedThread = новый ConnectedThread (сокет, тип сокета); mConnectedThread.start(); // Отправляем имя подключенного устройства обратно в действие пользовательского интерфейса Сообщение msg = mHandler.obtainMessage(WoosimPrnMng.MESSAGE_DEVICE_NAME); Bundle Bundle = новый Bundle(); Bundle.putString(WoosimPrnMng.DEVICE_NAME, device.getName()); msg.setData(пакет); mHandler.sendMessage(msg); setState(STATE_CONNECTED); } /** * Остановить все потоки */ общедоступная синхронизированная недействительная остановка () { if (D) Log.d(TAG, «стоп»); если (mConnectThread! = ноль) { mConnectThread.cancel(); mConnectThread = ноль; } если (mConnectedThread! = ноль) { mConnectedThread.cancel(); mConnectedThread = ноль; } setState (STATE_NONE); } /** * Запись в ConnectedThread несинхронизированным способом. * @param out Байты для записи * @see ConnectedThread#write(byte[]) */ public void write(byte[] out) { // Создаём временный объект ConnectedThread r; // Синхронизируем копию ConnectedThread синхронизировано (это) { если (mState!= STATE_CONNECTED) return; г = mConnectedThread; } // Выполняем запись несинхронизировано r.write(выход); } /** * Укажите, что попытка подключения не удалась, и уведомите об этом действие пользовательского интерфейса. */ частное недействительное соединениеFailed() { // Когда приложение будет уничтожено, просто вернёмся если (mState == STATE_NONE) возврат; // Отправляем сообщение об ошибке обратно в Activity Сообщение сообщения = mHandler.obtainMessage(WoosimPrnMng.MESSAGE_TOAST); Bundle Bundle = новый Bundle(); Bundle.putInt(WoosimPrnMng.TOAST, R.string.connect_fail); msg.setData(пакет); mHandler.sendMessage(msg); // Запускаем службу заново, чтобы перезапустить режим прослушивания BluetoothPrintService.this.start(); } /** * Укажите, что соединение потеряно, и уведомите об активности пользовательского интерфейса. */ частное недействительное соединениеLost() { // Когда приложение будет уничтожено, просто вернёмся если (mState == STATE_NONE) возврат; // Отправляем сообщение об ошибке обратно в Activity Сообщение сообщения = mHandler.obtainMessage(WoosimPrnMng.MESSAGE_TOAST); Bundle Bundle = новый Bundle(); Bundle.putInt(WoosimPrnMng.TOAST, R.string.connect_lost); msg.setData(пакет); mHandler.sendMessage(msg); // Запускаем службу заново, чтобы перезапустить режим прослушивания BluetoothPrintService.this.start(); } /** * Этот поток запускается при попытке установить исходящее соединение. * с устройством. Он проходит прямо насквозь; связь либо * успешный или неудачный. */ частный класс ConnectThread расширяет поток { частный окончательный BluetoothSocket mmSocket; частный окончательный BluetoothDevice mmDevice; частная строка mSocketType; public ConnectThread (устройство BluetoothDevice, логическое значение Secure) { ммДевице = устройство; BluetoothSocket tmp = ноль; мсокеттипе = безопасный? «Безопасно»: «Небезопасно»; // Получаем BluetoothSocket для соединения с // задано BluetoothDevice пытаться { если (безопасно) { tmp = device.createRfcommSocketToServiceRecord(SPP_UUID); } еще { tmp = device.createInsecureRfcommSocketToServiceRecord(SPP_UUID); } } catch (IOException e) { Log.e(TAG, "Тип сокета: " + mSocketType + "сбой создания()", e); } ммсокет = ТМП; } общественный недействительный запуск () { Log.i(TAG, "BEGIN mConnectThread SocketType:" + mSocketType); setName("ConnectThread" + mSocketType); // Всегда отменяйте обнаружение, поскольку это замедлит соединение mAdapter.cancelDiscovery(); // Подключаемся к BluetoothSocket пытаться { // Это блокирующий вызов, который возвращается только при // успешное соединение или исключение ммSocket.connect(); } catch (IOException e) { // Закрываем сокет пытаться { ммсокет.закрыть(); } поймать (IOException e2) { Log.e(TAG, "невозможно закрыть() " + mSocketType + " сокет при сбое соединения", e2); } Log.e(TAG, «Ошибка соединения», e); соединение не удалось(); возвращаться; } // Сбрасываем ConnectThread, потому что все готово синхронизировано (BluetoothPrintService.this) { mConnectThread = ноль; } // Запускаем подключенный поток подключен (mmSocket, mmDevice, mSocketType); } общественная недействительная отмена () { пытаться { ммсокет.закрыть(); } catch (IOException e) { Log.e(TAG, "close() of Connect" + mSocketType + "Ошибка сокета", e); } } } /** * Этот поток запускается во время соединения с удаленным устройством. * Он обрабатывает все входящие и исходящие передачи. */ частный класс ConnectedThread расширяет поток { частный окончательный BluetoothSocket mmSocket; частный окончательный InputStream mmInStream; частный окончательный OutputStream mmOutStream; public ConnectedThread (сокет BluetoothSocket, StringocketType) { Log.d(TAG, "создать ConnectedThread: " + тип сокета); ммSocket = сокет; Входной поток tmpIn = ноль; Выходной поток tmpOut = ноль; // Получаем потоки ввода и вывода BluetoothSocket пытаться { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { Log.e(TAG, «временные сокеты не созданы», e); } ммВход = tmpIn; ммOutStream = tmpOut; } общественный недействительный запуск () { Log.i(TAG, "BEGIN mConnectedThread"); буфер байт[] = новый байт[1024]; целые байты; // Продолжаем слушать InputStream при подключении в то время как (истина) { пытаться { // Читаем из входного потока байты = mmInStream.read(буфер); // буфер может быть перезаписан данными следующего входного потока, поэтому его следует скопировать byte[] rcvData = новый байт[байты]; rcvData = Arrays.copyOf(буфер, байты); // Отправляем полученные байты в UI Activity mHandler.obtainMessage(WoosimPrnMng.MESSAGE_READ, bytes, -1, rcvData).sendToTarget(); } catch (IOException e) { Log.e(TAG, «Соединение потеряно», e); соединение потеряно(); перерыв; } } } /** * Запись в подключенный OutStream. * @param buffer Байты для записи */ общественная недействительная запись (буфер байта []) { пытаться { ммOutStream.write(буфер); } catch (IOException e) { Log.e(TAG, «Исключение при записи», e); } } общественная недействительная отмена () { пытаться { ммВПотоке.закрыть(); ммOutStream.закрыть(); ммсокет.закрыть(); } catch (IOException e) { Log.e(TAG, «Ошибка закрытия() сокета подключения», e); } } } } Выдает ошибку при connectionFailed
Мобильная версия