#java #android #sockets #bluetooth #rfcomm
#java #Android #сокеты #bluetooth #rfcomm
Вопрос:
На данный момент я разрабатываю новое приложение для Android. Мне требуется Bluetooth для этого приложения. Каждый раз, когда я хочу подключить два (сопряженных) устройства через систему serversocket / socket, я не могу создать рабочий сокет. Он всегда возвращает:
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
Итак, мой вопрос: использую ли я недопустимый UUID? Если это не так. У вас есть какие-либо другие предложения, что может быть не так?
public Accept(BluetoothAdapter bt, BluetoothDevice device, Context context) {
try {
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
BluetoothServerSocket tmp = null;
try {
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00294F9B3423");
//Here is the point when it doesn't work...
tmp = bt.listenUsingRfcommWithServiceRecord(context.getResources().getString(R.string.bt_string_for_profile_image), uuid);
} catch (Exception e) {
}
mmServerSocket = tmp;
bt_device = device;
} catch (Exception e) {
}
}
Заранее спасибо за вашу помощь.
Ответ №1:
Я думаю, вам не хватает инструкции accept здесь. После прослушивания вашим следующим заявлением должно быть tmp.accept(). Это решит вашу проблему. Итак, ваш код должен выглядеть следующим образом:
try {
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00294F9B3423");
Bluetoothsocket clientSocket;
//Here is the point when it doesn't work...
tmp = bt.listenUsingRfcommWithServiceRecord(context.getResources().getString(R.string.bt_string_for_profile_image), uuid);
clientSocket = tmp.accept();
}
Кроме того, здесь следует отметить одну вещь, принять вызов функции — это блокирующий код.
Надеюсь, это поможет.
Комментарии:
1. Прежде всего: Спасибо за ваш ответ. Но мне жаль говорить, что это не решило мою проблему. Я, вероятно, не дал вам достаточно кода. Мой код в основном похож на тот, который вы можете увидеть здесь: ссылка , поэтому я обрабатываю его как поток. И я вызываю метод accept() в методе run() этого потока.
2. Но как только я вызываю этот метод bt.listenUsingRfcommWithServiceRecord(context.getResources().getString(R.string.bt_string_for_profile_image), uuid); канал thr serversocket равен -1, поэтому я думаю, что это должно быть проблемой с этим методом?
3. Ооо.. Извините, я не знал вашего полного кода… Теперь первое, что вы можете сделать здесь, это проверить код ошибки / исключение, возвращаемое функцией прослушивания. Это поможет нам понять причину ошибки. Поскольку я прочитал предоставленную вами ссылку, listen может выдавать исключение только в этих случаях «по ошибке, например, Bluetooth недоступен, или недостаточно разрешений, или используемый канал «.
4. Кроме того, можете ли вы попробовать этот UUID: 00001101-0000-1000-8000-00805F9B34FB
5. Я так рад сообщить, что мне каким-то образом удалось решить мою проблему.. К сожалению, я не могу точно сказать вам, как мне это удалось.. Но я действительно хочу поблагодарить вас за все время, которое вы потратили на меня. Большое вам спасибо. В случае, если у меня возникнет другая проблема с моим приложением Bluetooth, я снова спрошу вас, все ли у вас в порядке, еще раз: большое спасибо.