Connessione “perfetta” tra Android Wear e Smartphone

By dicembre 6, 2015Android, Android Wear

Connessione Android Wear e Smartphone (Message.API)

Introduzione

In questo articolo vorrei mostrare i codici essenziali per connettere in maniera stabile la tua applicazione Android su smartphone con la tua applicazione sugli smartwatch Android Wear.

Requisiti per seguire il tutorial:

  • conoscere Android
  • aver già visto la libreria Android Wear
  • conoscere Android Studio

In questo articolo farò uso solo delle Message API di Android Wear e del WearableListenerService per creare un canale di comunicazione dallo smartwatch allo Smartphone e viceversa. La comunicazione tra il Service in ascolto dei messaggi inviati dalla controparte avviene tramite LocalBroadcastManager e BroadcastReceiver.

Partiamo creando un progetto su Android Studio che sia anche un progetto android wear come in figura:

struttura_progetto_wear

build.gradle

Siccome stiamo usando Gradle, dobbiamo innanzitutto aggiungere la libreria google-play-services per poter connettere lo smartphone con android wear.

all’interno delle dependencies{}  dentro al file build.gradle (module mobile) aggiungiamo la riga

compile ‘com.google.android.gms:play-services:+’,

dove is simbolo + sostituisce il numero della versione delle api che cambia con gli aggiornamenti. Con il + potremmo non preoccuparci di riferimenti a versioni sbagliate o vecchie.

La stessa riga dovrà essere aggiunta all’interno delle dependencies{}  dentro al file build.gradle (module wear) .

Manifest

Adesso bisognerà modificare il manifest di entrambi i progetti mobile e wear.

Aggiungiamo all’interno del manifest <manifest ..> … </manifest>, fuori dal tag <application.. /> il seguente meta:

MainActivity

Andiamo  ad aggiungere il seguente codice alla MainActivity dell’applicazione sullo SmartPhone.

Le prime righe di codice non hanno bisogno di spiegazioni.

Nella riga:

 

dichiariamo ed inizializiamo la variabile GoogleApiClient mApiClient dichiarando di voler usurfruire delle Api Wearable.API e attacchiamo due callbacks, uno per tenere sotto controllo la connessione, l’altro per ricereve eventuali errori di connession per provare poi a risolverli.

Ma perchè vediamo due thread e a cosa serve il BroadcastRecaeiver:  usiamo due Thread perchè  la connessione e la disconessione  con il Google Play Services possono impiegare del tempo e bloccano l’interfaccia rendendola poco “responsive” per cui è consigliato avviarle da altri Thread.

Il BroadcastReceiver è invece usato per ricevere i dati dal Service in background che riceverà per noi i messaggi dal Wearable. Ma di questo parlerò dopo.

Sistemiamo intanto i riferimenti alle varie variabili: connCallback, connFailCallback.

Ho usato un enum CONNECTION_STATE { CONNECTED, SUSPENDED, LOST} per tenere traccia sullo stato della connessione ma si può usare tranquillamente un boolean settato a true se viene chiamato onConnected(..) oppure settato a false in onConnectionSuspended(…) .

Non appena ci siamo connessi, dopo che onConnected viene chiamato dal sistema, possiamo finalmente far terminare il nostro thread usato per la connessione con join().  Solo se siamo connessi possiamo finalmente registrare un nodeListener, un altro callback che si attiverà non appena ci conneteremo ad un Node. Ma cosaè un Node? In Android wear, un Node è un’istanza di qualsiasi devices connesso tramite le Wearable API e quindi in questo caso un Node può esssere sia uno smarwatch Android Wear che uno smartphone.

 

Se la connessione non dovesse avvenire, per varie ragioni come ad esempio il bluetooth di uno dei devices è spento, allora il sistema proverà a risolvere il problema mostrando all’utente l’appropriata azione da intrapprendere per risolvere il problema.

Se il problema risulta irrisolto, allora forzeremo l’app a tentare di nuovo a connettersi, latrimenti se nessuna soluzione è disponibile, mostreremo all’utente un ErrodDialofFragment contenente il codice relativo all’errore.

Il codice per l’ ErrorDialogFragment è:

e l’ ” onActivityResult” necesario per la funzion “startResolutionForResult” è:

Coonection Thread

I thread per connessione al Google Play Services inizializzati nell’ onCreate della MainActivity sono cosi implementati:

La connessione viene avviata  nell’ onStart(..) dell’Activity.

Il controllo sulla variabile mResolvingError avviene per evitare di riconnetterci in caso il sistema stia gia gestendo un precedente failConnection registrato sul GooglePlayApiClient.

Viene avviato nell’ onStop dell’Activity assieme ad altri controlli come la rimozionde di Listeners (nodeListener and BoradcastReceiver).

BroadcastReceiver

Veniamo ora al BroadcastReceiver inizializzato nell’ onCreate(..) dell’Activity.

Usiamo questo BroadcastReceiver per intercettare tutti i messaggi che riceveremo dallo smartwatch o dallo smartphone. Il BroadcastReceiver va registrato nell’ onResume dell’Activity.

e rilasciato nell’onStop().

Mandare un Messaggio?

Per mandare un messaggio dallo smartwatch android wear al device android tramite le Message Api basta chiamare questo metodo.

Usiamo un thread perchè l’operazione può bloccare la ui e richiedere piu tempo del dovuto, inoltre solo se siamo connessi avrà senso mandare il messaggio.

Al Wearable.MessageApi.sendMessage dobbiamo passare innanzitutto l’instanza ddel nostro GoogleApiClient, poi l‘id del Node a cui vogliamo mandare il messaggio ( Al momento ogni android device può connettersi comunicare con un solo smartwatch alla volta  nodes.getNodes()  ritorna  un solo node), il path che non è altro che una stringa identificativa che deve essere univoca e identica sia per chi manda il messaggio che per chi lo riceve.  Infine l’informazione che vogliamo mandare: text.getBytes(). Abbiamo dovuto convertire la string in bytes perchè possiamo inviare solo array di bytes byte[]. Ma poi convertiremo i byte[] nuovamente nella Stringa di origine.

WearableListenerService

Questo service è quello che gestirà i dati in entrata e lo farà in background per noi. Verrà gestito a seconda del bisogno dal systema per cui non dovremo preoccuparci.  Per usurfruire del service basterà implmentare un nostro service che lo estenda. DataListenerService è il mio service.

Il nostro path in questo caso è la stringa “/in/data”,. Non appena riceviamo il messaggio lo mandiamo in broadcast locale con il LocalBroadcastManager. Qualsiasi BroadcastReceiver registarto per l’intent filter “REQUEST_PROCESSED”) ricereà il mesaggio.

Il Service deve essere dichairato nel manifest all’interno del tag <application ..> </application>

 

Conclusione

I codici sopra sono validi sia per l’applicazione su smartwatch che su smartphone. Il codice completo lo puoi trovare sul mio profilo GitHub al seguente link:

Source Code on GitHub

 

 

 

 

 

 

Leave a Reply