Nel precedente tutorial, ho introdotto gli oggetti principali per interagire con il modulo bluetooth di uno smartphone Android e vi ho mostrato come elencare i dispositivi associati al telefono. Oggi vedremo invece come chiedere ad Android di cercare nuovi dispositivi…
Discovery e permessi
Per poter utilizzare la funzionalità di discovery di nuovi dispositivi bluetooth, è necessario dichiarare un nuovo permesso per la nostra app: BLUETOOTH_ADMIN
Per eseguire una nuova discovery è sufficiente invocare il metodo startDiscovery dell’oggetto BluetoothAdapter:
mBluetoothAdapter.startDiscovery(); |
Questo metodo è asincrono: sottomette la richiesta di iniziare una nuova scansione al S.O. Android e ritorna. Perché la nostra app sia informata di quando un dispositivo viene rilevato e di quando il processo di discovery termina, è necessario utilizzare i BroadcastReceiver.
Receivers e Intent filters
Una app può chiedere ad Android di essere informata di particolari eventi; ad esempio della ricezione di un SMS o del fatto che la carica della batteria sia in esaurimento. Questo tipo di eventi sono notificati alle app tramite dei messaggi broadcast: le app possono ricevere i messaggi creando degli oggetti di tipo BroadcastReceiver.
Una volta creato l’oggetto, è necessario indicare ad Android di quali eventi l’app deve essere informata. Per ogni evento è necessario creare il relativo filtro (IntentFilter); infine tramite il metodo registerReceiver() è possibile chiedere al SO di chiamare, per l’evento indicato nell’IntentFilter, il BroadcastReceiver specificato:
Nel nostro caso, dobbiamo ricevere due eventi:
- BluetoothDevice.ACTION_FOUND quando un nuovo dispositivo è rilevato
- BluetoothAdapter.ACTION_DISCOVERY_FINISHED quando il processo di discovery termina
Creiamo i relativi IntentFilter e registriamo il Receiver:
IntentFilter deviceFoundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND); IntentFilter discoveryFinishedfilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(mReceiver, deviceFoundFilter); registerReceiver(mReceiver, discoveryFinishedfilter); |
Il BroadcastReceiver deve implementare il metodo onReceive(), chiamato da Android per notificare l’evento:
mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); |
La stringa action consente di identificare l’evento che viene notificato e agire di conseguenza:
if (BluetoothDevice.ACTION_FOUND.equals(action)) { // visualizzo il nuovo dispositivo } if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { // abilito nuovamente il pulsante che attiva la scansione } |
App
Anche l’app di questo esempio è molto semplice: attiva la scansione e visualizza l’elenco dei dispositivi trovati.
I suoi sorgenti sono disponibili su Github.
thanks Luca,
waiting the next tut