Android e Bluetooth (1)

luca 11/03/2014 1

Un progetto a cui sto lavorando prevede il controllo tramite Android; ho quindi pensato che fosse l’occasione giusta per scrivere un tutorial su come utilizzare la connettività bluetooth in applicazioni Android…

Prerequisiti

Questo tutorial prevede che abbiate una minima conoscenza di come sviluppare una applicazione Android: in rete si possono trovare delle ottime guide, iniziando da quella ufficiale di Google. Potete scegliere l’IDE che più preferite: personalmente mi trovo bene con EclipseADT plugin.

Sorgenti

Tutte le applicazioni di esempio verranno pubblicate in un repository su Github.

Application permissions

Perché la nostra applicazione possa utilizzare la connettività bluetooth del telefono, è necessario dichiarare di utilizzare tale funzionalità. Avrete infatti notato che quando si installa una nuova applicazione, Android chiede se si accetta di concedere a tale applicazione i permessi necessari al suo funzionamento.

Apriamo il file AndroidManifest.xml

Spostiamoci sul tab Permissions, quindi clicchiamo Add…

Selezioniamo Uses Permission

Infine selezioniamo android.permission.BLUETOOTH e salviamo il file

BluetoothAdapter

L’oggetto che consente di interfacciarsi con il modulo bluetooth del telefono è BluetoothAdapter.

Possiamo ottenere l’instanza di default tramite il metodo statico getDefaultAdapter():

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

Se il telefono non ha il modulo bluetooth, il metodo restituisce null; in questo caso possiamo visualizzare un messaggio di errore (Toast) e chiudere l’applicazione:

Toast.makeText(this, "This app requires a bluetooth capable phone", Toast.LENGTH_SHORT).show();
finish();

Dobbiamo quindi verificare che il modulo bluetooth sia abilitato, tramite il metodo isEnabled():

mBluetoothAdapter.isEnabled()

In caso non sia abilitato, possiamo richiederne l’abilitazione tramite una Intent. Definiamo una costante per identificare la nostra richiesta; quindi creiamo una Intent e sottomettiamola al sistema Android:

private final int REQUEST_ENABLE_BT = 1;
[...]
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

La nostra applicazione viene messa in secondo piano e all’utente appare un popup con la richiesta di abilitare il bluetooth:

Una volta che l’utente ha confermato (o negato) la richiesta di attivazione, viene chiamato il metodo onActivityResult, dove possiamo verificare se la richiesta ha avuto o meno esito positivo:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 if(requestCode == REQUEST_ENABLE_BT)
 if(resultCode == RESULT_OK) listPairedDevices();

Paired devices

In questo primo esempio, andremo ad elencare i dispositivi già accoppiati (paired) al telefono. Un dispositivo bluetooth deve essere infatti accoppiato (eventualmente inserendo una password numerica) prima di poter stabilire la connessione.

Il metodo getBondedDevices() restituisce un Set di oggetti di tipo BluetoothDevice:

Set pairedDevices = mBluetoothAdapter.getBondedDevices();

Ogni dispositivo bluetooth ha un nome e un indirizzo (univoco); possiamo visualizzare in una TextArea i dati dei dispositivi accoppiati con un loop:

for(BluetoothDevice pairedDevice : pairedDevices) {
 textView2.append(Html.fromHtml("<strong>" + pairedDevice.getName() + "</strong>"));
 textView2.append(" (" + pairedDevice.getAddress() + ")\n");
}

Ecco l’applicazione in esecuzione:

Next

Nella prossima parte di questo tutorial vedremo come effettuare lo scan e il pairing di nuovi dispositivi…

One Comment »

  1. Piero 01/04/2014 at 11:14 - Reply

    Interessante e utilissimo come sempre.
    Grazie per il primo (e anche per il secondo) post sull’argomento. Ho preso un economico modulo BT HC-05 su Ebay e funziona alla grande con Arduino e l’app ArduDroid, per controllare PIN digitali e analogici.

    Ma vorrei iniziare a farmi una App “DIY” che accenda e spenga i “soliti led”, e sono certo che seguendoti ci riuscirò ;-)

    un saluto

Leave A Response »