2011-09-07 15 views
40

Mam aplikację, w której programowo kontroluję parowanie i rozłączanie Bluetooth. Potrafię sparować przed połączeniem i sparować później. Powód, dla którego muszę to zrobić, jest specyficzny dla mojego wniosku, a nie w zakresie mojego pytania.Jak mogę uniknąć lub odrzucić powiadomienie o parowaniu Bluetooth w Androidzie, gdy robię parowanie programowe?

zasadzie to, co robię jest:

  1. uzyskać odwołanie ib do IBluetooth przedmiot opisany w this answer
  2. Zarejestruj BroadcastReceiver dla android.bluetooth.device.action.PAIRING_REQUEST
  3. połączeń ib.createBond(address)
  4. Czekaj na BroadcastReceiver wywołać
  5. Konwersja PIN użytkownika na bajty z convertPinToBytes()
  6. połączenia ib.setPin(address, pinBytes) od wewnątrz BroadcastReceiver

Anyways, takie podejście działa świetnie, z wyjątkiem faktu, że kiedy wykonać parowanie, dostaję powiadomienie na pasku stanu, prosząc użytkownika o podanie numeru PIN, aby zakończyć łączenie w pary. Ale w rzeczywistości nie jest to konieczne, ponieważ do czasu, gdy użytkownik to zobaczył, moja aplikacja już używała setPin(). Bardzo bym chciał, aby to powiadomienie: a) w ogóle się nie pojawiło, lub b) zostanie jakoś automatycznie odrzucone.

Wiem, że to może nie być możliwe, ale pomyślałem, że zapytam, na wypadek, gdyby ktoś miał pomysł.

+1

Czy możesz dodać przykładowy kod (lub link do kodu źródłowego). To, co chcę zrobić, jest w rzeczywistości takie samo jak Ty. Chcę połączyć się z urządzeniem bez żądania hasła. Z poważaniem, Jeroen – Jeroen

+1

Niestety nie mogę udostępnić mojego kodu źródłowego, ale krok po kroku, który mam powyżej, jest bardzo zbliżony do rzeczywistego kodu. Możesz zacząć korzystać z kodu źródłowego w odpowiedzi, do której link w kroku 1. –

+0

@JoelF czy rozwiązałeś swój problem? Ponieważ ja nie. Naprawdę doceniam, że możesz podzielić się tym, jak rozwiązać, jeśli tak jest. – Tiago

Odpowiedz

1

Czy to w przypadku zgłoszenia 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(); 

Ale musisz mi powiedzieć, w jaki sposób powiązać swoje urządzenie zdalne bez użytkownikowi na wprowadzenie klucza dostępu/PIN? poza kursem, znasz kod PIN zdalnego urządzenia, które próbuje sparować z urządzeniem, ale w jaki sposób przekazałeś ten kod PIN do zdalnego urządzenia.

+0

Ciekawe, pozwól mi spróbować. Zaktualizowałem swoją odpowiedź, aby nieco bardziej szczegółowo opisać, w jaki sposób programowałem parowanie bez interakcji użytkownika. Nadzieja, która pomaga. –

+0

Czy możesz wyjaśnić, czym dokładnie jest paramBluetoothDevice? – Tiago

14

Spróbuj ustawić potwierdzenie pierwszy w 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); 

ten pracował dla mnie między dwoma urządzeniami z systemem Android przy użyciu RFCOMM ale ja nie wprowadzając żadnych PIN

+0

Na marginesie, wywoływanie cancelPairingUserInput nie było konieczne w moich testach. – domsom

+1

To nie działa. Jeśli użyję tego kodu, proces parowania się nie rozpocznie i pojawia się komunikat o błędzie, że nie ma takiej metody o nazwie "cancelPairingUserInput" – Mulgard

+0

Po prostu zauważyłem, że działa to również w celu zapobiegania denerwującym pop-upom dotyczącym parowania połączeń podczas łączenia z już sparowanymi urządzeniami niektóre modele z najnowszymi wersjami Androida (GT-I9295, Android 4.4.2) – dhakim

9

Ponieważ Android API 19 Google włącza do tych metod Metody publiczne, więc nie ma już potrzeby Refleksji. :)

Powiązane problemy