Android e Bluetooth (2)

luca 18/03/2014 1

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.

One Comment »

  1. jmv 25/03/2014 at 17:25 - Reply

    thanks Luca,
    waiting the next tut

Leave A Response »