首页 > 解决方案 > 断开设备后未调用 OnConnectionStateChange

问题描述

当我从参数中禁用蓝牙时,我遇到了问题。我使用广播接收器来监听这个动作,当它的状态关闭时,我调用一个方法来断开我的外围设备。在我的日志中,我只看到D/BluetoothGatt: cancelOpen()但根据BluetoothGatt.class服务调用我们的BluetoothGattCallbackindisconnect方法onConnectionStateChanged轮流调用,DEVICE_DISCONNECTED并且在 20 或 30 秒后我什么也没有(主管超时)。

当我想用我的内部方法直接断开我的设备时,它可以正常工作。

这是断开连接的方法:

   /**
     * Disconnects an established connection, or cancels a connection attempt
     * currently in progress.
     *
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
     */
    public void disconnect() {
        if (DBG) Log.d(TAG, "cancelOpen() - device: " + mDevice.getAddress());
        if (mService == null || mClientIf == 0) return;

        try {
            mService.clientDisconnect(mClientIf, mDevice.getAddress());
        } catch (RemoteException e) {
            Log.e(TAG,"",e);
        }
    }

我用反射检查了 mClientIf 是否等于 0 或者 mService 是否为 Null,但他进入下一步并输入 try/catch。所以我不明白这里的Android行为

标签: androidbluetoothgatt

解决方案


我根据这个库和这个类找到了一个解决方案: https://github.com/NordicSemiconductor/Android-BLE-Library/blob/master/ble/src/main/java/no/nordicsemi/android/ble/BleManager。爪哇

private final BroadcastReceiver mBluetoothStateBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(final Context context, final Intent intent) {
        final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
        final int previousState = intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, BluetoothAdapter.STATE_OFF);

        switch (state) {
            case BluetoothAdapter.STATE_TURNING_OFF:
            case BluetoothAdapter.STATE_OFF:
                if (mConnected && previousState != BluetoothAdapter.STATE_TURNING_OFF && previousState != BluetoothAdapter.STATE_OFF) {
                    // The connection is killed by the system, no need to gently disconnect
                    mGattCallback.notifyDeviceDisconnected(mBluetoothDevice);
                }
                // Calling close() will prevent the STATE_OFF event from being logged (this receiver will be unregistered). But it doesn't matter.
                close();
                break;
        }
    }
};

我根据自己的需要对其进行了调整,但我也使用断开连接的设备信息来调度我的事件,并调用我自己的关闭方法来释放资源并准备另一个连接。


推荐阅读