代码之家  ›  专栏  ›  技术社区  ›  Rany Albeg Wein

RxBluetooth无法与设备建立连接

  •  0
  • Rany Albeg Wein  · 技术社区  · 6 年前

    我想用 RxBluetooth 在两台android设备之间传输一些文本。 我可以扫描和查看附近的设备,但在尝试连接其中一个设备时,我面临以下失败:


    D/蓝齿乌贼: IsSocketAllowedBySecurityPolicy启动:设备为空

    带蓝牙适配器: 调用了getBluetoothService(),但没有BluetoothManagerCallback

    D/蓝牙插座: 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
                    }
                })
    

    两个设备都启用了蓝牙,因为我可以从另一个设备中发现一个。

    我使用的权限是:

    <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 回复  |  直到 6 年前
        1
  •  0
  •   Rany Albeg Wein    6 年前

    问题解决了。 我忘了 observeBluetoothSocket() :

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

    Commonsguy RxEcho (中建议的示例应用程序 公用软件 他的评论)帮助我认识到了这个事实。 RXECHO 也帮助我发现 RxJava2 Extras 通过 David Moten 这使得从插座读取数据非常方便:

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

    谢谢你抽出时间来阅读我的问题。