RxBluetooth не может установить соединение с устройством - PullRequest
0 голосов
/ 03 июня 2018

Я хотел бы использовать RxBluetooth для передачи текста между двумя устройствами Android.Я могу сканировать и видеть близлежащие устройства, хотя при попытке подключиться к одному из них я сталкиваюсь со следующей ошибкой:


D / BluetoothUtils: isSocketAllowedBySecurityPolicy start: device null

W / BluetoothAdapter: getBluetoothService () вызывается без BluetoothManagerCallback

D / BluetoothSocket: connect (), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor [65]}

java.io.IOException: чтение не удалось, сокет может быть закрыт или истекло время ожидания, чтение ret: -1


Этокод, который я запускаю для установления соединения с выбранным BluetoothDevice:

mRxBluetooth.observeConnectDevice(bluetoothDevice, UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"))
            .subscribeOn(mSchedulerProvider.io())
            .observeOn(mSchedulerProvider.ui())
            .subscribe(new Consumer<BluetoothSocket>() {
                @Override
                public void accept(BluetoothSocket bluetoothSocket) throws Exception {
                    // Unable to reach here.
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    // I reach this point with the message:
                    // java.io.IOException: read failed, socket might closed or timeout, read ret: -1
                }
            })

Bluetooth включен на обоих устройствах, так как я могу обнаружить одно из другого.

Разрешения, которые я использую:

<uses-feature
    android:name="android.hardware.bluetooth_le"
    android:required="true"/>

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

Спасибо.

1 Ответ

0 голосов
/ 04 июня 2018

Проблема решена.Я забыл observeBluetoothSocket():

        mRxBluetooth
            .observeBluetoothSocket("MyConnection", UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"))
            .subscribeOn(mSchedulerProvider.io())
            .observeOn(mSchedulerProvider.ui())
            .subscribe(this::observeIncomingMessages,
                    throwable -> {/*Handle error*/});

Commonsguy s RxEcho (пример приложения, предложенный в комментарии CommonsWare ) помогя осознаю этот факт. RxEcho также помог мне найти RxJava2 Extras от David Moten , который сделал чтение данных из сокета очень удобным:

        Strings.from(btSocket.getInputStream())
           .subscribeOn(mSchedulerProvider.io())
           .observeOn(mSchedulerProvider.ui())
           .subscribe(data -> {/* Post data to LiveData*/},
                   throwable -> {/* Handle error*/});

Спасибо зане торопясь и читая мой вопрос.

...