In aanraking met Android Wear

Waar technologie ons voorheen vooral ontlastte van fysieke activiteiten, zijn nu onze hersenen aan de beurt voor ‘verlichting’. We hebben zowat alle informatie van de wereld in onze broekzak en dat biedt gigantisch veel mogelijkheden, maar ja… het zit nog wel in die broekzak. Als ik op de fiets naar het station race, zou mijn smartphone theoretisch al kunnen inschatten of ik een tandje bij moet zetten om droog aan te komen en mijn trein te halen. Alleen, wat heeft mijn broekzak daaraan?

Introductie

Wearables die draag je op je in plaats van bij je. De informatie uit je broekzak zou zo soepeler kunnen mengen met het dagelijkse leven. In plaats van jouw aandacht naar de virtuele wereld te trekken, doen we dit andersom. Zou ik kunnen voelen of ik de trein ga halen?

Wat betreft Java zitten we goed. Er zijn inmiddels tal van wearables op de markt die op verschillende Android-varianten draaien. Zo is er de Google Glass en is er een groeiend aantal smartwatches. Elektronicafabrikanten lijken vooral heil te zien in marktwatches, getuige het grote aanbod. De afgelopen maanden heb ik mij als beginnend programmeur mogen verdiepen in Android Wear development voor de smartwatch. Dit voor een applicatie die feedback moet gaan geven over de emotie van mensen met autisme. In dit stuk deel ik graag mijn eerste ervaringen, waarbij ik ervan uit ga dat de lezer dezelfde achtergrond in dergelijke ontwikkeling heeft als ik.

 

Mogelijke toepassingen

Google ziet de smartwatch vooral als een context-afhankelijke ‘verlenging’ van je smartphone (handheld), die je informatie geeft op het moment dat die van toepassing is, bijvoorbeeld afhankelijk van je locatie. Zo zou je in de auto bij een naderende file geïnformeerd kunnen worden of bij een bushalte wanneer jouw bus vertraging heeft.

 

Calm technology

In deze tijd gedreven maatschappij is het gebruik van notificaties en alerts, ook bij wearables, goed te begrijpen. In tegenstelling tot het idee van concrete berichten op je pols, zie ik in wearables vooral kansen, doch ontwerp-uitdagingen in de richting van calm technology. Deze theorie van Mark Weiser e.a. pleit voor informatievoorziening op een natuurlijkere en niet-opdringerige wijze (‘calm’) en voornamelijk vanuit de periferie. Ongeveer zoals je bij een donkere hemel onbewust kunt aanvoelen dat het best eens zou kunnen gaan regenen. “That what informs, but doesn’t demand our focus or attention”.

Ik kijk op mijn gewone horloge wanneer ik dat wil, bijvoorbeeld als ik het gevoel heb dat het wel eens lunchtijd zou kunnen zijn. Je moet er niet aan denken dat je horloge je bij een groepsgesprek op Whatsapp steeds om aandacht vraagt. Het lijkt mij bijzonder gaaf als, wanneer je ogen langs je horloge glijden, je door het kleurenpalet of de vorm van de wijzerplaat gerust gesteld kan worden dat er wat planning betreft geen vuiltje aan de lucht is voor de komende tijd.

Apple lijkt met haar smartwatch deze abstractere weg al in te gaan, waar technologie als verlenging van je natuur wordt ingezet. Op het moment dat ik dit schrijf, is dit nog niet op de markt. Maar de smartwatch zou bijvoorbeeld je hartslagen kunnen delen, zodat iemand anders die weer om zijn pols kan voelen. De techniek kan zo nog knap intiem worden!

Op naar technische inhoud van de Android Wear.

 

Het platform

Om context-relevante informatie te kunnen geven, is het kleine Android-apparaatje aan de pols uitgerust met een aantal sensoren voor onder meer versnelling, hartslag en spraak. De meeste watches zijn afhankelijk van een handheld voor hun netwerkfuncties, zoals telefonie en internet, maar ook voor positiebepaling. Deze brug wordt gemaakt met Bluetooth. De verbonden handheld mag helaas niet te oud zijn. De noodzakelijke Android Wear-app valt enkel te installeren op handhelds met minimaal Android-versie 4.3.

 

API’s en de IDE

De eerste Android API voor Wear is de KitKat 4.4W (API 20). Met de komst van Lollipop zit de hele mikmak in dezelfde API 21. Dat betekent dat je, naast device-specifieke API’s, op hetzelfde API-level werkt voor ontwikkeling voor Android op handheld, Wear, tv en auto.

Een tijd lang was Eclipse met de Android Development Toolkit (ADT) de standaard IDE voor Android-ontwikkeling. Daar kwam later Android Studio bij (zie ook het artikel van Rutjes in Java Magazine 2013-2), een aangepaste IntelliJ-versie. Fijn natuurlijk, enige keuzevrijheid, maar Google vindt het tijd om een keuze te maken en doet dat graag voor je. Support voor Eclipse heeft ze laten vallen.

Een hoop specifieke Wear-elementen zijn pas toe te voegen bij het importeren van één of meerdere dependencies. Welke van deze libraries je daadwerkelijk gebruikt, hangt af van wat je van plan bent. De wearable UI support library (zie eerste dependency in listing) zal je al snel gebruiken, maar daarover later meer. De wearable Data Layer (zie tweede dependency in listing) is voor communicatie (indien die meer is dan notificaties) tussen wearables en handhelds.


 dependencies {
    compile 'com.google.android.support:wearable:1.1.0'
    compile 'com.google.android.gms:play-services-wearable:6.5.87'
 }

 

stuk uit Gradle build script

Ontwikkeling voor wearables in Eclipse houdt in dat je die handmatig moet importeren. Het is mij tot op heden niet gelukt om specifieke wearable GUI-elementen (later meer hierover) in Eclipse te laten accepteren door de compiler.
Android Studio bouwt de app met Gradle, waarmee de dependencies voor de wearables een stuk eenvoudiger worden toegevoegd. Een nieuw wearable-project is dan ook zo aangemaakt (zie afbeelding 2[a1] ). Selecteer bij het maken van een nieuwe project simpelweg het vinkje bij Wear en de juiste dependencies worden automatisch in de Gradle build-file opgenomen.

Afbeelding 2: het maken van een nieuw Wear-project in Android Studio)

Alle tutorials op de uitgebreide developersite van Android zijn inmiddels gericht op deze ontwikkelomgeving. Wellicht dat gebruik van Gradle in Eclipse de ontwikkeling daarin soepeler maakt, maar Android Studio werkt momenteel wel zo prettig.

 

Opzet

De opzet van een smartwatch-app kan nogal verschillen en dat is vooral afhankelijk van haar doel. Voor het ontdekken van de functies van de watch kan het al interessant zijn om een stand-alone-applicatie te bouwen die los van de handheld op de watch draait. Je kunt ook twee applicaties schrijven, een voor de watch en een voor de gekoppelde handheld. Op deze manier kun je bijvoorbeeld internetfuncties toevoegen aan je app. Wanneer je al een applicatie hebt voor de handheld en je wilt notificaties ervan kunnen weergeven op de smartwatch, dan kun je met enkele aanpassingen aan je bestaande code uit de voeten.

Wat voor de app ook een interessante toevoeging is, is de mogelijkheid tot het bouwen van een eigen zogenaamde ‘watchface’, een soort van custom wijzerplaat. Je kunt je app ermee uitbreiden, maar er ook een aparte app van maken met slechts continue (tijds)weergave als doel.

Welke opzet je ook kiest, bij distributie krijg je de app enkel via de Google Play Store van een gepairde handheld op de smartwatch geïnstalleerd.

 

Meten en data

Met een achtergrond en interesse in medische technologie, ben ik vooral geïnteresseerd in de hartslagsensor. De exacte werking van deze sensor geeft Samsung in ieder geval niet vrij, maar vrij zeker is dat een transducer aan de achterkant van de watch groen licht uitzendt en tintverandering van de huid bij elke hartslag weer oppikt vanaf je pols. Het kan altijd even duren voordat het eerste meetresultaat komt en dan kan het zomaar gebeuren dat je hartslag zogenaamd lager is bij rennen dan bij rustig stilzitten. En als die meting al zou kloppen, dan is het duidelijk tijd voor weekend. Ondanks de soms beperkte betrouwbaarheid is het voor een op een enkele pols gemeten hartslag waarschijnlijk de beste oplossing.

Het licht van de hartslagsensor

Hoe gaat dat?

Meten in Android bestaat vooral uit het instantiëren van een zogenaamde SensorManager, een Sensor en het implementeren van een SensorEventListener. Door tegen deze laatste interface aan te praten, krijg je in een onSensorChanged()-methode een SensorEvent terug met daarin onder andere meetwaarden en sensortype.

Enkele van de beschikbare sensoren zijn, net zoals bij de handheld, het resultaat van berekening van andere sensoren. Zo zijn de stappenteller en de linear acceleration (versnelling van alle assen met compensatie voor de valversnelling) waarschijnlijk niet anders dan dat.

 

Service of activity?

Voor de toepassing waar ik aan werk, moet continu de hartslag worden gemeten. Aangezien een Activity (een interactief front-end element of layout) doorgaans beëindigd wordt wanneer deze niet genoeg aandacht krijgt of een ander proces voorrang heeft, lijkt een achtergrondservice een logischere stap. Verrassend was dat bij de KitKat Wear API dit niet mogelijk was. Een hartslagmeting kon je slechts aan een Activity toevoegen, in tegenstelling tot alle andere sensoren. In de Lollipop API is dat probleem opgelost en kan de sensor ook vanuit een Service worden benaderd.

 

Debugging

Bij alle tegen gekomen watches wordt de hartslagsensor bij het aansluiten van de cradle (voor het opladen en debuggen via USB) afgesloten van de buitenwereld. Dat is wat knullig, maar debuggen kan gelukkig ook via Bluetooth, ook al gaat het installeren van de apk (de build) een tikkie trager. Hiervoor sluit je een met Bluetooth gepairde en ingestelde handheld aan op de usb-poort van je machine en voer je enkele eenvoudige forwards in de adb shell in. Zie voor duidelijke uitleg: Bluetooth debugging

 

Interface en workflow

Met de introductie van Android Lollipop heeft Google een sterkere uniforme beeldtaal voor het gehele platform opgezet dan voorheen. Aan de tutorials te zien, zien ze bij Google graag dat developers dit zogenaamde ‘material design’ doorvoeren in de hoop het platform meer als één geheel te doen overkomen. Daarnaast geven ze het goede advies om voor de watch te ontwerpen voor ‘the corner of the eye’. Inderdaad, voor het randje van je periferie.

Van de Android-smartwatches die op de markt beschikbaar zijn, is de hoogste schermresolutie die ik ben tegengekomen 320 bij 320 pixels. Dat is natuurlijk vele malen minder dan je handheld heeft. Deze resolutie brengt een beperking in interactie met zich mee. Hiervoor heeft Google een aantal nieuwe GUI-elementen geïntroduceerd.

Zo zijn er nu card fragments, een soort kaartjes met informatie. Bij meerdere hiervan blader je er als het ware doorheen. Omdat de tekst op de watch niet automatisch is te schalen, zijn de kaartjes ‘scrollbaar’.

Ook in de menu’s kun je er flink op los scrollen. Aangezien er in Android Wear geen menubalk of ‘drawer’ is, zoals op de handheld, kun je een wearable list view inbouwen. Deze werkt, net als het standaard smartwatchmenu, met een scrollbare lijst aan items waar je weer de nodige acties aan kunt koppelen.

Het mooiste idee voor de watch is misschien nog wel de 2d-picker, waarbij je als gebruiker verticaal en horizontaal door vensters scrollt. Goed nadenken over de gewenste interactie hierbij is natuurlijk cruciaal.

Aan notificaties kun je acties koppelen die bijvoorbeeld op de handheld worden uitgevoerd. (zie afbeelding 4). Het inbouwen van al deze elementen vergt het nodige codewerk. Dit betekent meestal het voorbereiden van hun items (bijvoorbeeld elementen in de wearable list, de inhoud van de cards of de ‘fragmenten’ van de 2d-picker), ze aan de elementen te linken en deze te ‘inflaten’, ofwel te renderen, op het scherm.

Mockup van notificatie in vorm van een card en een gekoppelde actie

Wearable list view-stijl

 

Rond versus vierkant

Ook iets om rekening mee te houden: een aantal nieuwe smartwatches zijn rond. Standaard houdt Android Studio daar bij het maken van een nieuw Wear-project rekening mee door voor beide mogelijkheden een eigen lay-out te maken. Binnen die lay-outs kunnen weer andere schermonderdelen worden geladen. Je kunt ook gebruik maken van een soort frame in de layout (BoxInsetLayout), waarbinnen de marges afhankelijk van de watch-vorm zijn in te stellen.

Verschil in marges bij verschillende schermvormen

 

Conclusie

Wanneer je Android Studio gebruikt, is het al aardig eenvoudig om een simpele Android Wear app te schrijven, mede dankzij het feit dat de documentatie en tutorials van Google al aardig compleet zijn.

Ik hoop dat nieuwe apps voor de wearables niet op al te onderbrekende, maar eerder op abstractere wijze de gebruiker van informatie zullen voorzien. Het Android Wear-platform biedt legio mogelijkheden en ik ben benieuwd waar creatieve ontwikkelaars mee gaan komen. Ik heb er in ieder geval alle vertrouwen in dat ik binnenkort via een wearable merk dat ik te langzaam fiets.

Bij dit artikel is een eenvoudige Wear-app te vinden op Github om de hartslag te meten. Ga naar: https://github.com/rvegt/JavaMagazineWear

Referenties

Links