Android La sa va rden fra n sensorer

Relevanta dokument
Mobila applikationer och trådlösa nät

Android Rita och touch events

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Föreläsning 3: Händelsestyrda program och användargränssnitt

PROGRAMMERINGSTEKNIK TIN212

Lego Robot [ ] [ ] [ ]

Programmering. Scratch - grundövningar

Lektion Händelsehanterare

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Android översikt. TDDD80 Mobila och sociala applikationer

För alla uppgifter på tentan gäller: Man får använda både standard-c++ (som till exempel har pekare som anges med * och objekt som skapas med new) och

F4. programmeringsteknik och Matlab

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Introduktion till arv

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Kort om klasser och objekt En introduktion till GUI-programmering i Java

OOP Objekt-orienterad programmering

Klassdeklaration. Metoddeklaration. Parameteröverföring

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tentamen , Grundläggande programmering i Java

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Properties. Användbara metoder som kan anropas i propertychanged:

1 Kravspecifikation Snake App

Mer om grafiska komponenter. Händelsestyrda program

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Classes och Interfaces, Objects och References, Initialization

Statistik över heltal

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

DAT043 - Föreläsning 7

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Sphero SPRK+ Appen som används är Sphero Edu. När appen öppnas kommer man till denna bild.

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Laboration 13, Arrayer och objekt

Metoder (funktioner) Murach s: kap Winstrand Development

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Objektorienterad Programmering (TDDC77)

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

TENTAMEN I DATAVETENSKAP

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Beacon BluFi Bluzone. Givarna har mycket hög känslighet och kan mäta mycket små förändringar.

Tentamen Nätverksprogrammering Lösningsförslag

Föreläsning 2, vecka 8: Repetition

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Användarmanual Onepix MDX Installer 1.1 SVENSK

F8: Typkonvertering i C++

Malmö högskola 2007/2008 Teknik och samhälle

Laboration A Objektsamlingar

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

TDDI82 - Projekt. Christoffer Holm. Institutionen för datavetenskap (IDA)

Laboration 3 GUI-programmering

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Tentamen EDA698 Realtidssystem (Helsingborg)

Tentamen i Objektorienterad modellering och design

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Lösningar till tentamen i EDAF25

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Grundläggande programmering med C# 7,5 högskolepoäng

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

F5: Högnivåprogrammering

Lab5 för prgmedcl04 Grafik

Föreläsning 2, vecka 6: Tillstånd i objektorienterade program (och mera interface)

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Objektorientering i liten skala

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

OOP Objekt-orienterad programmering

2D1339 Programkonstruktion för F1, ht 2003

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

F5: Högnivåprogrammering

Kurs i programmering Java Uppgifter

Imperativ programmering. Föreläsning 4

Generiska konstruktioner. Kursbokens kapitel 13

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Övningar Dag 2 En första klass

C++ Slumptalsfunktioner + switch-satsen

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

1 Comparator & Comparable

Dugga Datastrukturer (DAT036)

Transkript:

Android La sa va rden fra n sensorer Notera att detta endast är en introduktion och inte fullständiga instruktioner. För att komma vidare på egen hand kan du följa de länkar till texter som anges. Sensorer i smart phones och liknande enheter En smart phone eller tablet är idag utrustad med en uppsättning inbyggda sensorer. Exempel på vanliga sensorer idag är Accelerometer (acceleration/gravitation) Gyroskop (rotationshastighet, rad/s) Magnetometer Ljus, IR m.m., ex. fotodioder Tryck (atmosfärs-) Temperatur Dessutom finns ofta mjukvara för att kombinera flera sensorer för att få ut ny information; t.ex. kan värden från accelerometer, gyroskop och magnetometer kombineras för att ge information om hur enheten är orienterad i rummet (en s.k. virtuell sensor). SensorEventListener För att läsa av värden som en sensor genererar måste man skriva en lyssnarklass och koppla ett objekt av denna lyssnarklass till en specifik sensor, dvs. liknande som när du vill lyssna på om användaren tryckt på en knapp (men i detta fall implementerar du ett interface som heter SensorEventListener). Detta görs i applikationens aktivitet och lyssnarklassen kan t.ex. se ut så här: private class AccelerometerListener implements SensorEventListener { public void onsensorchanged(sensorevent event) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; long t = event.timestamp; // milli seconds // Do something with the information Vad värdena i event.values (en s.k. array av data; här flyttal, float) står för beror på vilken typ av sensor vi lyssnar på (informationen finns i dokumentationen på developer.android.com). För en accelerometer representerar värdena respektive accelerationen i x-led, y-led och z-led, se figur 1 för definition av riktningarna.

Figur 1 Koordinatsystem för accelerometer, relativt enheten. Källa http://developer.android.com. Registrera och avregistrera en SensorEventListener Registrera lyssnare För att få tillgång till en specifik sensor, och koppla en lyssnare till denna, använder vi oss av enhetens SensorManager, se nedan. sensormanager = (SensorManager) getsystemservice(context.sensor_service); Sensor accelerometer = sensormanager.getdefaultsensor(sensor.type_accelerometer); sensormanager.registerlistener(accelerometerlistener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); Den sensortyp som anges kan t.ex. vara Sensor.TYPE_ACCELEROMETER TYPE_GRAVITY (virtuell) TYPE_LINEAR_ACCELERATION (virtuell) TYPE_GYROSCOPE TYPE_ORIENTATION (compound, virtuell) TYPE_ROTATION_VECTOR (virtuell) TYPE_LIGHT TYPE_MAGNETIC_FIELD TYPE_PRESSURE Det delay som anges när man registrerar lyssnaren anger ungefärligt hur ofta lyssnaren ska ta emot värden från sensorn. Standardvärden är: SensorManager.SENSOR_DELAY_NORMAL ( 5 Hz) SENSOR_DELAY_UI SENSOR_DELAY_GAME ( 50 Hz) SENSOR_DELAY_FASTEST

Avregistrera en lyssnare Eftersom en lyssnare som registrerats på en sensor förbrukar resurser (batteri, CPU-tid m.m.) bör man avregistrera lyssnaren så snart vi inte behöver sensor-data längre. Avregistreringen av lyssnaren görs så här: if (sensormanager!= null) { sensormanager.unregisterlistener(accelerometerlistener); Testa själv Testkör projektet AccelerometerExample och studera hur värdena varierar när telefonens orientering i rummet ändras (de värden som visas är [a x, a y och a z ]). Vad representerar värdet på a z när telefonen ligger på en horisontell yta? Studera lyssnarklassen samt koden för att registrera och avregistrera lyssnaren. Man bör avregistrera lyssnaren då applikationen inte är aktiv längre, dvs. då aktiviteten inte längre är den som användaren ser längst fram på skärmen (då behöver vi i de flesta fallen inte längre data från sensorn). Det är det som görs i metoderna onpause och onpause i aktiviteten; dessa metoder anropas när aktiviten lämnar fokus, respektive alldeles innan den hamnar i fokus igen. Vill du veta mer om hur man programmerar med sensorer i Android kan du läsa här: http://developer.android.com/guide/topics/sensors/sensors_overview.html Snake revisited Utgå från projektet SnakeWithAccelerometer. Detta projekt innehåller all kod som behövs för att läsa värden från accelerometern, men du måste själv lägga till hur du ska använda värdena (ax,ay,az) för att styra ormen. I klassen MainActivity finns kod för lyssnarklassen, AccelerometerListener. Det är i metoden onsensorchanged, som kommer att anropas när det finns ett nytt sensorvärde, som du skriver koden som tolkar sensorvärdena och därefter ändrar ormens riktning. Metoderna startlistening och stoplistening innehåller kod för att registrera lyssnaren respektive avregistrera denna när den inte behövs längre. Dessa metoder anropas i onresume respektive onpause som exekveras automatiskt då applikationen visas respektive döljs av andra applikationer. Du behöver inte ändra i denna kod. Testa själv Lägg till att användaren kan styra ormens riktning genom att luta skärmen. Gå till metoden onsensorchanged i MainActivity. Kontrollera om accelerationen längs x-axeln är större än något värde, t.ex. 2,0 m/s 2, och ändra i så fall riktningen på masken till WEST (eller till EAST? du behöver fundera eller testa för att veta vilket). Du ändrar maskens riktning med snakemodel.setdirection(direction.west/east/north eller SOUTH) Gör sedan på samma sätt med accelerationen i y-led (NORTH eller SOUTH). Kör du fast finns ett lösningsförslag längst bak i detta dokument.

Förbättra också spelet så att ett nytt äpple slumpas ut så fort ormen ätit ett och att ormen växer med ett segment när den ätit ett äpple (se instruktionerna i dokumentet Android Rita och touch events ).

Lösningsförslag SensorEventListener för Snake Denna kod läser av accelerationen i enhetens x- och y-led (se figur 1 för referens) och ändrar ormens riktning om värdet överstiger ett tröskelvärde (THRESHOLD, du får testa dig fram till lämpligt värde). För att komma åt SnakeModel i aktiviteten (jag ska ju ev. ändra ormens riktning) använder jag metoden snakview.getsnakemodel (som finn i klassen SnakeView). private class AccelerometerListener implements SensorEventListener { private final float ACC_THRESHOLD = 2.0F; public void onsensorchanged(sensorevent event) { double ax = event.values[0]; double ay = event.values[1]; double az = event.values[2]; long time = event.timestamp; //Log.i("SnakeSensor", "(" + x + "," + y + "," + z + ")"); //Log.i("SnakeSensor", "timestamp: " + time); SnakeModel snakemodel = snakeview.getsnakemodel(); if(ay > ACC_THRESHOLD) { Log.i("SnakeSensor", "South down"); snakemodel.setdirection(direction.south); else if(ay < -ACC_THRESHOLD) { Log.i("SnakeSensor", "North down"); snakemodel.setdirection(direction.north); if(ax > ACC_THRESHOLD) { Log.i("SnakeSensor", "West down"); snakemodel.setdirection(direction.west); else if(ax < -ACC_THRESHOLD) { Log.i("SnakeSensor", "East down"); snakemodel.setdirection(direction.east); public void onaccuracychanged(sensor sensor, int accuracy) { // Du måste naturligtvis även registrera lyssnaren (samt avregistrera den när den inte längre behövs, t.ex. när spelet är över).