Android Подключите устройство Bluetooth автоматически после программного сопряжения

В моем приложении мне нужно подключить устройство Bluetooth и немедленно подключиться к нему.

У меня есть следующая функция для сопряжения устройств:

public boolean createBond(BluetoothDevice btDevice)
{
    try {
        Log.d("pairDevice()", "Start Pairing...");
        Method m = btDevice.getClass().getMethod("createBond", (Class[]) null);
        Boolean returnValue = (Boolean) m.invoke(btDevice, (Object[]) null);
        Log.d("pairDevice()", "Pairing finished.");
        return returnValue;

    } catch (Exception e) {
        Log.e("pairDevice()", e.getMessage());
    }
    return false;
}

И я использую это следующим образом:

Boolean isBonded = false;
try {
    isBonded = createBond(bdDevice);
    if(isBonded)
    {
         //Connect with device
    }
}

И он показывает мне диалог для сопряжения устройств и введите пин-код.

Проблема в том, что функции createBond всегда возвращают true, и он ждет, пока я не введу пин-код и не соединится с устройством, поэтому я не использую правильно:

isBonded = createBond(bdDevice);
if(isBonded) {...}

Итак, вопрос в том, как я могу подключиться к устройству и когда оно подключено к нему?

PD Мой код основан на первом ответе следующего потока: Android + Пара устройств через Bluetooth программно

1 ответ

Решение

Я нашел решение.

Сначала мне нужно BroadcastReceiver лайк:

private BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                // CONNECT
            }
        } else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Discover new device
        }
    }
};

И тогда мне нужно зарегистрировать получателя следующим образом:

IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
context.registerReceiver(myReceiver, intentFilter);

Таким образом, приемник слушает ACTION_FOUND (Откройте для себя новое устройство) и ACTION_BOND_STATE_CHANGED (Устройство меняет свое состояние связи), затем я проверяю, является ли новое состояние BOND_BOUNDED и если это так, я соединяюсь с устройством.

Теперь, когда я звоню createBond Метод (описано в вопросе) и введите пин-код, ACTION_BOND_STATE_CHANGED будет стрелять и device.getBondState() == BluetoothDevice.BOND_BONDED будет True и он подключится.

Другие вопросы по тегам