Как отключить, но не разорвать пару с уже сопряженными наушниками Bluetooth в Android

Я передаю HeadphoneConnectThread устройство Bluetooth, например SONY WH-1000XM3, которое я получаю от: Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();.

Класс HeadphoneConnectThread пытается установить соединение с наушниками Bluetooth.

Соединительная часть работает нормально, т. е. сопряженные наушники подключены, и на них можно передавать данные.

Чтобы отключиться, я вызываю close(), который обновляет состояние BluetoothSocket (см. ниже), однако наушники не отключаются.

socket.isConnected()=false, headphone.getBondState()=12

Состояние связи 12:

https://developer.android.com/reference/android/bluetooth/BluetoothDevice#BOND_BONDED


public class HeadphoneConnectThread extends Thread {

public static final UUID uuid = UUID.fromString("96cc203e-5068-46ad-b32d-e316f5e069ba");

private final BluetoothDevice headphone;
private BluetoothSocket socket;

public HeadphoneConnectThread(BluetoothDevice headphone) {
    BluetoothSocket tmp = null;
    this.headphone = headphone;

    try {
        tmp = headphone.createRfcommSocketToServiceRecord(uuid);
    } catch (IOException e) {
        Log.e(TAG, "Socket's create() method failed", e);
    }
    socket = tmp;
}

public void run() {
    try {
        Log.d(TAG, "Connecting to " +  headphone.getName() + ", address=" + headphone.getAddress());
        if (!socket.isConnected()) {
            socket.connect();
            Log.d(TAG, "Connected");
        } else {
            Log.d(TAG, "Headphone already connected");
        }

        Thread.sleep(3000);

        if (socket.isConnected()) {
            disconnectHeadphone();
        }
    } catch (IOException e) {
        ...
    }
}


public void disconnectHeadphone() {
    try {
        Log.d(TAG,"Disconnecting " +  headphone.getName() + ", address=" + headphone.getAddress());
        socket.getOutputStream().close();
        socket.getInputStream().close();
        socket.close();
        Log.d(TAG, "Disconnected, socket.isConnected()=" + socket.isConnected() +
                ", headphone.getBondState()=" + headphone.getBondState());
        socket = null;
    } catch (IOException e) {
        Log.e(TAG, "Error occurred while disconnecting", e);
    }
}

person aamir    schedule 17.08.2020    source источник


Ответы (1)


Из документов, которые вы связали:

Being bonded (paired) with a remote device does not necessarily mean the device is currently connected. It just means that the pending procedure was completed at some earlier time, and the link key is still stored locally, ready to use on the next connection.

Поэтому, если ваш код выводит socket.isConnected = false и bondedState=12, это просто означает, что он связан и отключен.

В вашем коде нет ошибки.

person Fede    schedule 18.08.2020