web-dev-qa-db-fra.com

Comment puis-je éviter ou ignorer la notification d'appairage Bluetooth d'Android lorsque je fais un appariement programmatique?

J'ai une application où je contrôle par programmation l'appairage et le désappairage Bluetooth. Je peux coupler avant la connexion et dissocier ensuite. La raison pour laquelle je dois le faire est spécifique à ma demande et ne relève pas de la portée de ma question.

Fondamentalement, ce que je fais est:

  1. Obtenez une référence ib à IBluetooth objet comme décrit dans cette réponse
  2. Enregistrez un BroadcastReceiver pour Android.bluetooth.device.action.PAIRING_REQUEST
  3. Appeler ib.createBond(address)
  4. Attendez que BroadcastReceiver se déclenche
  5. Convertir la broche utilisateur en octets avec convertPinToBytes ()
  6. Appelez ib.setPin(address, pinBytes) depuis BroadcastReceiver

Quoi qu'il en soit, cette approche fonctionne très bien, sauf que lorsque je fais le jumelage, je reçois une notification dans la barre d'état demandant à l'utilisateur d'entrer un PIN pour terminer le jumelage. Mais c'est en fait inutile, car au moment où l'utilisateur voit cela, mon application a déjà utilisé setPin(). J'aimerais vraiment que cette notification soit a) n'apparaisse pas du tout, soit b) soit automatiquement rejetée .

Je me rends compte que ce n'est peut-être même pas possible, mais j'ai pensé que je demanderais au cas où quelqu'un aurait une idée créative.

43
Joel F

Essayez de définir d'abord la confirmation dans le 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);

Cela a fonctionné pour moi entre deux Android utilisant RFCOMM mais je n'entre aucun code PIN

14
dimpey

Depuis Android API 19 Google a changé ces méthodes en méthodes publiques, donc il n'y a plus besoin de Reflection. :)

11
Erik Mueller

Pour ce faire, dans l'événement de notification 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();

Mais vous devez me dire comment avez-vous jumelé votre appareil distant sans que l'utilisateur n'entre la clé d'accès/PIN? bien sûr, vous connaissez le PIN pour le périphérique distant qui essaie de se coupler à votre appareil, mais comment l'avez-vous fourni PIN au périphérique distant).

1
ghost