Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 45 di 97
  • livello avanzato
Indice lezioni

Bluetooth

Come dialogare con i dispositivi Bluetooth, direttamente dalla nostra app.
Come dialogare con i dispositivi Bluetooth, direttamente dalla nostra app.
Link copiato negli appunti

Auricolari, tastiere, mouse. Ma anche modem, navigatori e vivavoce. Il termine Bluetooth richiama alla mente una serie di dispositivi diffusissimi nel
quotidiano dell'utente. In generale, stiamo parlando di un protocollo per la comunicazione wireless a brevi distanze, solitamente operante nel raggio di
alcuni metri. Gli smartphone attuali lo integrano nella maggior parte dei casi e non potrebbe essere diversamente date le potenzialità di interazione a
livello elettronico che offre.

Inoltre se da un lato molti dispositivi che fino a pochi anni fa venivano utilizzati in Bluetooth sono ormai stati assorbiti – a livello di funzionalità –
dagli smartphone (si pensi al navigatore satellitare) l'attuale mercato della microelettronica offre nuovi strumenti altamente configurabili per i quali
questa via di comunicazione appare uno scenario efficiente e produttivo. In questa categoria rientra la famosissima scheda programmabile Arduino o il microcomputer Raspberry Pi. Possono essere impiegati in soluzioni utili in ambienti domestici, lavorativi o
industriali ed un'app Android sarebbe la soluzione ideale per attuarne il controllo.

Sono quindi tanti i motivi per affrontare l'integrazione di Bluetooth nelle API Android ed il presente capitolo mostra una panoramica dei principali
concetti utili per mettersi in marcia.

Discovery dei dispositivi

La prima fase, solitamente necessaria, per lavorare con Bluettoth è la ricerca (anche denominata discovery, scoperta) di dispositivi disponibili nei paraggi. L'esempio che stiamo per mostrare
si occupa proprio di questo. Cercherà eventuali controparti nei paraggi e ne mostrerà i nomi in una ListView.

Per fare ciò è necessario innanzitutto che:

  • il nostro dispositivo Android disponga del supporto Bluetooth;
  • nell'AndroidManifest della nostra applicazione siano predisposte le necessarie permission:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

Oltre che essere disponibile nel dispositivo, il Bluetooth dovrebbe essere attivato. Ciò non è stato richiesto tra i prerequisiti visto che nell'esempio seguente impareremo ad affrontare anche questa situazione.

Il layout dell'app è molto semplice, contiene solo un pulsante per attivare la ricerca ed una ListView per mostrarne i risultati.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cerca dispositivi"
android:onClick="scan"/>
<ListView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listview"/>
</LinearLayout>

All'interno dell'Activity Java ci occuperemo, come presumibile, di istanziare tutti gli oggetti necessari al funzionamento del layout, in primis Adapter e
ListView, ma soprattutto di approntare il necessario all'utilizzo di Bluetooth.

La classe prioritaria per l'integrazione è ancora una volta uno specifico Adapter: BluetoothAdapter. Sarà lui, una volta che il supporto per il
protocollo sarà correttamente attivato, a cercare "in giro" eventuali dispositivi con cui comunicare.

L'impostazione dell'Activity è la seguente:

public class MainActivity extends Activity
{
private BluetoothAdapter btAdapter;
private Set dispositivi;
private ListView lv;
private ArrayAdapter adapter = null;
private static final int BLUETOOTH_ON=1000;
. . .
. . .
}

La costante intera BLUETOOTH_ON servirà solo come codice di richiesta nell'uso dell'Intent. Nelle righe precedenti si vede anche un'altra classe legata al mondo Bluetooth ed è BluetoothDevice. Il Set di oggetti di questo tipo conterrà i riferimenti dei dispositivi individuati nelle vicinanze.

Il metodo onCreate predispone le configurazioni iniziali:

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btAdapter = BluetoothAdapter.getDefaultAdapter();
lv = (ListView)findViewById(R.id.listview);
adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1);
lv.setAdapter(adapter);
}

mentre il metodo scan serve a gestire il click sul pulsante:

public void scan(View v)
{
if (!btAdapter.isEnabled())
{
Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnOn, BLUETOOTH_ON);
}
else
load();
}

Qui iniziamo ad entrare nel vivo delle funzionalità. Infatti, come detto in precedenza, il supporto Bluetooth nel dispositivo Android deve essere presente ed attivato. Il metodo isEnabled cercherà di verificare proprio questo ed in caso di esito negativo lancerà l'Intent che chiederà all'utente il permesso di farlo (vedere in figura).

La finestra di dialogo sarà proprio il risultato dell'Intent lanciato. Visto che si è usato il metodo startActivityForResult, il risultato verrà consegnato nel metodo onActivityResult di cui faremo l'override:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==BLUETOOTH_ON && resultCode==RESULT_OK)
{
load();
}
}

Come si può vedere per essere sicuri che l'utente ha accettato l'attivazione del Bluetooth è necessario che il codice di richiesta sia pari a BLUETOOTH_ON ed il codice di ritorno a RESULT_OK, una costante definita all'interno della classe Activity.

Infine il metodo load, più volte invocato, contiene il codice necessario per reperire i dispositivi ed inserirne i nomi all'interno dell'adapter:

private void load()
{
dispositivi = btAdapter.getBondedDevices();
adapter.clear();
for(BluetoothDevice bt : dispositivi)
adapter.add(bt.getName());
}

La figura seguente mostra i nomi dei dispositivi trovati. Nel caso dell'esempio è stato individuata una sola interfaccia Bluetooth con cui comunicare il cui nome è ospite-pc-0.

Ti consigliamo anche