2011-09-07 14 views
40

Ho un'app in cui sono in grado di controllare in modo programmatico l'associazione e l'annullamento dell'accoppiamento Bluetooth. Posso accoppiare prima della connessione e poi disassociarmi. Il motivo per cui ho bisogno di farlo è specifico per la mia applicazione e non nell'ambito della mia domanda.Come posso evitare o ignorare la notifica di abbinamento Bluetooth di Android quando eseguo l'associazione programmatica?

Fondamentalmente quello che sto facendo è:

  1. ottenere un riferimento ib a IBluetooth oggetto come descritto nel this answer
  2. Registrare un BroadcastReceiver per android.bluetooth.device.action.PAIRING_REQUEST
  3. chiamata ib.createBond(address)
  4. Attendere BroadcastReceiver per innescare
  5. Converti pin utente in byte con convertPinToBytes()
  6. chiamata ib.setPin(address, pinBytes) dall'interno BroadcastReceiver

In ogni modo, questo approccio funziona bene, tranne per il fatto che quando faccio l'accoppiamento, ricevo una notifica nella barra di stato chiedendo che all'utente di inserire un codice PIN per completare la accoppiamento. Ma questo non è necessario, perché quando l'utente lo vede, la mia app ha già utilizzato setPin(). Mi piacerebbe davvero che la notifica a) non appaia affatto, o b) venga automaticamente ignorata in qualche modo.

Mi rendo conto che questo potrebbe non essere possibile, ma ho pensato di chiedere se qualcuno ha un'idea creativa.

+1

Puoi aggiungere un po 'di codice di esempio (o un link al tuo codice sorgente). Quello che voglio fare è in realtà lo stesso di te. Voglio connettermi a un dispositivo senza la richiesta della password. Cordiali saluti, Jeroen – Jeroen

+1

Purtroppo non posso condividere il mio codice sorgente, ma il passo passo che ho sopra è molto vicino al codice reale. Puoi iniziare con il codice sorgente nella risposta a cui faccio il link al passaggio 1. –

+0

@JoelF hai risolto il problema? Perché non lo sono. Apprezzo davvero se puoi condividere come risolvi, se è così. – Tiago

risposta

1

Fate questo in caso di notifica 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(); 

Ma devi dirmi come hai fatto si associa il dispositivo a distanza senza che l'utente di inserire chiave di accesso/PIN? Ovviamente, si conosce il PIN per il dispositivo remoto che tenta di accoppiarsi al dispositivo, ma come è stato fornito il PIN al dispositivo remoto.

+0

Interessante, lasciami provare. Ho aggiornato la mia risposta per essere un po 'più specifico su come ho fatto l'abbinamento programmatico senza l'interazione dell'utente. Spero possa aiutare. –

+0

Puoi spiegare esattamente cos'è il paramBluetoothDevice? – Tiago

14

provare a impostare la conferma prima nella 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); 

Questo ha funzionato per me tra due dispositivi Android utilizzando RFCOMM ma non sto inserendo i pin

+0

Come nota a margine, la chiamata cancelPairingUserInput non è stata necessaria nei miei test. – domsom

+1

Questo non funziona. Se uso questo codice il processo di accoppiamento non inizia e ricevo un messaggio di errore che non esiste un tale metodo chiamato 'cancelPairingUserInput' – Mulgard

+0

Ho appena notato che questo funziona anche per evitare fastidiosi pop-up di richiesta di pairing quando ci si connette a dispositivi già accoppiati su alcuni modelli che eseguono versioni recenti di Android (GT-I9295, Android 4.4.2) – dhakim

9

Dal API Android 19 Google commutata questi metodi per metodi pubblici, quindi non c'è più bisogno di Reflection. :)

Problemi correlati