Android, BluetoothSocket - как я могу узнать, существует ли соединение или мне нужно позвонить?

Привет, я пытаюсь реализовать библиотеку Bluetooth, и в ней я хочу один раз подключить сокет rfcomm, а затем повторно использовать его для всех вызовов. Я хочу знать, подключен он или нет, чтобы узнать, следует ли мне вызывать подключить метод. Я ничего не могу найти в исходном коде для сокетов Bluetooth, так как все это нативные вызовы, и в API не определен метод isConnected... У кого-нибудь есть опыт в этом?


person ekatz    schedule 18.05.2011    source источник


Ответы (3)


Я думаю, у вас будет переменная-член, поддерживающая состояние вашего соединения. при успешном соединении установите для него значение true, запустите поток, который зацикливается, всегда читая байты из входного потока сокетов, и если вы получите IOException в этом потоке, установите для своего флага значение false.

person jkhouw1    schedule 19.05.2011
comment
поскольку я пытаюсь написать методологию синхронного (блокирующего) вызова, я собираюсь выполнить запись, а затем сразу прочитать, это означает, что я не смогу поддерживать поток, который зацикливается и всегда пытается читать. однако, если я правильно понимаю ваш ответ, вы говорите, что я должен предположить, что если я получаю исключение чтения из входных или выходных потоков сокета, я могу предположить, что соединение разорвано. Это правильно? - person ekatz; 19.05.2011
comment
да Исключения ввода-вывода или намерение отключения Bluetooth говорят нам, что соединение разорвано. проверьте github.com/gtosoft/ libvoyager/blob/master/src/com/gtosoft/ - person Brad Hein; 19.05.2011

Я ответил на аналогичный вопрос здесь. Начиная с уровня API 14 в классе BluetoothSocket доступен метод isConnected. Для более низких уровней API вы можете открыть сокет, выполнить свою работу и снова закрыть его. Однако есть кое-что, что вам, возможно, придется рассмотреть, больше в связанном ответе.

person AgentKnopf    schedule 03.07.2012
comment
Некоторые устройства всегда возвращают false методу isConnected - person Anthone; 12.02.2015
comment
@Anthone afaik по спецификации должно работать. Поэтому, если это не сработает, я бы счел это аномалией, в которой, вероятно, имеет смысл подать отчет об ошибке. В качестве альтернативы пока используйте ответ Icsmoretto. - person AgentKnopf; 13.02.2015

isConnected() никогда не работает для меня. Попробуйте что-то вроде этого:

try {
  mSocket.connect()
} catch (IOException e) {
  // Create a new socket
  // mSocket.connect();
}
person Lucas Moretto    schedule 08.06.2013
comment
Может быть, было бы полезно, если бы вы перечислили устройства, для которых isConnected не работает, и, возможно, отправили бы отчет об ошибке для них? - person AgentKnopf; 13.02.2015