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

У меня есть приложение, в котором я программно управляю сопряжением и отключением Bluetooth. Я могу соединиться до соединения и разомкнуть потом. Причина, по которой мне нужно это сделать, связана с моим заявлением, а не в рамках моего вопроса.

В основном то, что я делаю, это:

  1. Получить ссылку ib в IBluetooth объект, как описано в этом ответе
  2. Зарегистрировать BroadcastReceiver для android.bluetooth.device.action.PAIRING_REQUEST
  3. Вызов ib.createBond(address)
  4. Подождите, пока BroadcastReceiver сработает
  5. Преобразуйте пользовательский пин-код в байты с помощью convertPinToBytes()
  6. Вызов ib.setPin(address, pinBytes) из BroadcastReceiver

В любом случае, этот подход прекрасно работает, за исключением того факта, что когда я выполняю сопряжение, я получаю уведомление в строке состояния с просьбой ввести PIN-код для завершения сопряжения. Но это на самом деле не нужно, потому что к тому времени, когда пользователь видит это, мое приложение уже использовало setPin(), Мне бы очень хотелось, чтобы это уведомление либо а) вообще не появлялось, либо б) как-то автоматически отклонялось.

Я понимаю, что это может быть даже невозможно, но я подумал, что могу спросить, если у кого-то есть творческая идея.

3 ответа

Попробуйте сначала установить подтверждение в PAIRING_REQUEST

BluetoothDevice device = intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE");

device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true);
device.getClass().getMethod("cancelPairingUserInput").invoke(device);

Это работало для меня между двумя устройствами Android, использующими RFCOMM, но я не ввожу никаких ПИН-кодов

Начиная с Android API 19 Google переключил эти Методы на общедоступные Методы, поэтому в Reflection больше нет необходимости.:)

Сделайте это в событии уведомления PAIRING_REQUEST:

BluetoothDevice localBluetoothDevice = (BluetoothDevice)intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE");

Class localClass = localBluetoothDevice.getClass();
Class[] arrayOfClass = new Class[0];
localClass.getMethod("cancelPairingUserInput", arrayOfClass).invoke(paramBluetoothDevice, null)).booleanValue();

Но вы должны сказать мне, как вы подключили ваше удаленное устройство без ввода пароля / PIN-кода? Конечно, вы знаете ПИН-код для удаленного устройства, которое пытается выполнить сопряжение с вашим устройством, но как вы предоставили этот ПИН-код для удаленного устройства.

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