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