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
и он подключится.