Сопряжение Bluetooth - как отобразить простой диалог отмена / сопряжение?
Я подготовил простой тестовый проект для этого вопроса на GitHub.
Я пытаюсь создать приложение для Android, которое будет сканировать QR-код с экрана компьютера, а затем использовать данные (MAC-адрес и PIN-код или хэш) для простого сопряжения (соединения) с устройством Bluetooth.
Похоже на популярноеприложение InstaWifi - но для классического Bluetooth.
В целях тестирования я пока не делаю никакого сканирования штрих-кодов, а просто показываю список устройства:

После того, как пользователь коснется одного из устройств, сопряжение выполняется в MainActivity.java :
private void startBluetoothPairing(BluetoothDevice device) {
Intent pairingIntent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
BluetoothDevice.PAIRING_VARIANT_PIN);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, 1234);
//device.setPin(new byte[]{1,2,3,4}); <- DOES NOT CHANGE ANYTHING
//device.setPairingConfirmation(false);
startActivityForResult(pairingIntent, REQUEST_BT_SETTINGS);
}
К сожалению, всплывающее окно по-прежнему запрашивает PIN-код:

Поскольку я фактически указал PIN-код в своем исходном коде, я на самом деле ожидал, что будет показано другое, более простое системное диалоговое окно (это показано при выполнении сопряжения NFC OOB):

Из поиска решений я знаю, что существует setPin () метод, но он здесь неприменим (или нет?)- потому что я пытаюсь подключить весь смартфон к устройству Bluetooth, а не только приложение...
Мой вопрос: Как сделать Android OS, чтобы показать простой диалог отмены/пары?
Поиск запроса на сопряжение Bluetooth строки на GitHub не показал никаких подсказок...
UPDATE: по предложению unrealsoul007 (спасибо) я обновил исходный код в MainActivity.java а теперь появится простое диалоговое окно отмена / пара:
private void startBluetoothPairing(BluetoothDevice device) {
Intent pairingIntent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION);
pairingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(pairingIntent, REQUEST_BT_PAIRING);
}
Однако я не уверен, как завершить процесс сопряжения - потому что onActivityResult вызывается с resultCode=0 еще до закрытия диалога:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
// this is called before user clicks Cancel or Pair in the dialog
if (requestCode == REQUEST_BT_PAIRING) {
if (resultCode == Activity.RESULT_OK) { // 0 != -1
Log.d("XXX", "Let#s pair!!!!"); // NOT CALLED
}
return;
}
}
1 ответ:
Вам будет предложено ввести pin-код, потому что это то, что вы запрашиваете в своем
pairingIntent.Вместо использования
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.PAIRING_VARIANT_PIN); pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_KEY, 1234);Использовать
pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PASSKEY_CONFIRMATION);Как уже упоминалось здесь ,
Пользователю будет предложено подтвердить ключ доступа, отображаемый на экране. экран или приложение подтвердит пароль для пользователя.
Comments