Как я могу избежать или отклонить уведомление Bluetooth о сопряжении Android, когда я занимаюсь программным сопряжением?
У меня есть приложение, в котором я программно управляю сопряжением и отключением Bluetooth. Я могу соединиться до соединения и разомкнуть потом. Причина, по которой мне нужно это сделать, связана с моим заявлением, а не в рамках моего вопроса.
В основном то, что я делаю, это:
- Получить ссылку
ib
вIBluetooth
объект, как описано в этом ответе - Зарегистрировать BroadcastReceiver для
android.bluetooth.device.action.PAIRING_REQUEST
- Вызов
ib.createBond(address)
- Подождите, пока BroadcastReceiver сработает
- Преобразуйте пользовательский пин-код в байты с помощью convertPinToBytes()
- Вызов
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-кода? Конечно, вы знаете ПИН-код для удаленного устройства, которое пытается выполнить сопряжение с вашим устройством, но как вы предоставили этот ПИН-код для удаленного устройства.