Lær hvordan du bruker Android Miljø Sensorer til å oppdage informasjon om brukerens miljø, inkludert omgivelsestemperatur, trykk, fuktighet og lys.
Android-systemet støtter en rekke enhetssensorer, noen implementert i maskinvare og noen i programvare. Miljøsensorene er alle maskinvarefunksjoner, som gir tilgang til informasjon om omgivelsestemperatur, trykk, fuktighet og lys. Disse sensorene returnerer verdier som følger: Temperaturen måles i grader Celsius, atmosfærisk trykk i hPa millibars, relativ luftfuktighet i omgivelsene som en prosentverdi og omgivelseslys i SI lux-enheter. I denne opplæringen løper vi gjennom grunnprosessen for å bruke disse fire hovedmiljøsensorene. Vi vil ikke bruke enhetens temperatursensor, da den nå er deprecated fra Android 4.0.
Det er mange mulige anvendelser for disse sensorer, som barometre og termometre. Du har kanskje kommet over slike apper i Google Play allerede, men det er verdt å merke seg at de ikke nødvendigvis må implementere sine funksjoner ved hjelp av miljøsensorer. For eksempel bruker værprogrammer ofte steddata hentet over nettet for å bestemme miljøinformasjon basert på hvor du er.
Siden disse sensorene leveres via brukerens maskinvare, varierer støtten mellom enheter og produsenter. I skrivende stund støtter svært få Android-smarttelefoner eller -tabletter alle miljøsensorene, men mange av de nyere modellene støtter en eller flere av dem. Det er viktig å utføre kontroller om brukeren har spesielle sensorer og å unngå å bruke funksjonalitet som er helt avhengig av dem. Det eneste unntaket til dette er at hvis du sikrer at bare brukere med nødvendig maskinvare kan laste ned søknaden din - du kan gjøre dette ved hjelp av filtre for en app som er oppført i Google Play-butikken.
Opprett et nytt Android-prosjekt i Eclipse og gi det et navn etter eget valg. La Eclipse skape en hovedaktivitet, da dette er den eneste klassen vi trenger. For koden som brukes i denne opplæringen, målretter vi Android API nivå 14 (Android 4.0 - Ice Cream Sandwich), men du kan målrette mot en nyere versjon hvis du ønsker det. Du trenger ikke å gjøre noen endringer i den mest åpenbare filen. Din hovedaktivitetsklasse skal ha følgende innledende struktur, med ditt valgte klassenavn:
offentlig klasse EnvironmentCheckerActivity utvider Aktivitet / ** Kalt når aktiviteten er først opprettet. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main);
Vi skal implementere et par grensesnitt, slik at du utvider din åpnings klasse erklæring linje som følger:
offentlig klasse EnvironmentCheckerActivity utvider Aktivitetsredskaper OnClickListener, SensorEventListener
Klikklytteren er for brukerinteraksjon, og Sensor Event Listener er for å motta data fra enhetssensorene. Eclipse burde ha gitt importopplysninger for aktivitets- og pakkeklassene, men du må også legge til følgende på listen:
importer android.content.Context; importere android.hardware.Sensor; importer android.hardware.SensorEvent; importer android.hardware.SensorEventListener; importer android.hardware.SensorManager; importer android.view.View; importer android.view.View.OnClickListener; importer android.widget.Button; importer android.widget.TextView; importer android.widget.Toast;
Vi legger til kode i klassen senere.
For å demonstrere den grunnleggende prosessen for bruk av miljøsensorer, skal vi bygge et enkelt brukergrensesnitt. Appen viser en liste med fire knapper, en for hver av sensorene vi skal bruke. Når brukeren velger en knapp, forsøker appen å hente den aktuelle informasjonen og presentere den i en tekstvisning. Først, la oss definere noen tekst Strings vi vil bruke innenfor grensesnittet. Åpne filen "res / values / strings.xml" og rediger den for å inneholde følgende:
Velg mellom alternativene for å sjekke miljøet ditt Miljøkontrollør Omgivelsestemperatur Lys Press Relativ luftfuktighet -
Disse representerer tittelen, innledende teksten, knappetiketter og en plassholder for tekstvisninger. Vi skal bruke et par trekkbare ressurser for designet, men du kan utelate dem hvis du ønsker det. For å bruke dem, må du opprette to ekstra filer, "back.xml" og "btn.xml" i hver av tegningens mapper, og velg "File"> "New"> " Fil ", og skriv deretter inn filnavnet). For filen "back.xml", skriv inn følgende kode:
For filen "btn.xml", skriv inn følgende:
Ryggdragbar er for aktivitetsbakgrunnen og "btn" drawable er for knappens bakgrunn. Du er velkommen til å endre disse designene på noen måte du ønsker - sørg for at du kopierer dem til hver tegningsbar mappe i appen din.
Åpne nå appens "main.xml" layoutfil (res / layout / main.xml). Skriv inn en rullevisning og lineær layout som følger:
Inne i linjær layout legger du inn introduksjonen, deretter en knapp og tekstvisning for hver av de fire sensorene:
Hvert knapp og tekstvisningspar er nesten identisk, med ID-attributter for å identifisere dem i Java-koden. Selvfølgelig kan du endre noen av designelementene hvis du ønsker det. Oppsettet refererer til de trekkbare ressursene og strengene.
Åpne appens hovedaktivitetsklasse. På toppen av klassedeklarasjonen legger du til følgende instansvariabler før "onCreate" -metoden:
privat knapp ambientBtn, lightBtn, pressureBtn, fuktighetBtn; privat tekstvisning ambientValue, lightValue, pressureValue, fuktighetValue;
Disse representerer knappene og tekstvisningene vi opprettet i oppsettet. Vi skal bruke en matrise for å holde oversikt over tekstvisningspunkter, da disse vil oppdatere med informasjon når sensorene returnerer det, så legg til følgende array-variabel neste:
privat tekstvisning [] valueFields = ny tekstvisning [4];
Legg nå disse konstantene for å referere til hver sensortype:
privat endelig int AMBIENT = 0; privat endelig int LIGHT = 1; privat endelig int PRESSURE = 2; privat endelig int HUMIDITY = 3;
Inne i "onCreate" -metoden, etter linjen der innholdsvisningen er satt, hente en referanse til hver knapp ved hjelp av ID-attributter som vi inkluderte i oppsettet, som følger:
ambientBtn = (Button) findViewById (R.id.ambient_btn); lightBtn = (Button) findViewById (R.id.light_btn); pressureBtn = (Button) findViewById (R.id.pressure_btn); fuktighetBtn = (knapp) findViewById (R.id.humidity_btn);
Sett nå hver av disse for å bruke Aktivitetsklassen som klikklytter:
ambientBtn.setOnClickListener (this); lightBtn.setOnClickListener (this); pressureBtn.setOnClickListener (this); humidityBtn.setOnClickListener (this);
Når disse knappene trykkes, vil aktiviteten "onClick" -metoden utføres. Deretter henter tekstvisningspunkter og legger til en referanse til hver i gruppen vi erklærte, ved hjelp av konstanter for å spesifisere hver indeks:
ambientValue = (TextView) findViewById (R.id.ambient_text); valueFields [omgivelsene] = ambientValue; lightValue = (TextView) findViewById (R.id.light_text); valueFields [Lys] = lightValue; pressureValue = (TextView) findViewById (R.id.pressure_text); valueFields [TRYKK] = pressureValue; fuktighetValue = (TextView) findViewById (R.id.humidity_text); valueFields [HUMIDITY] = humidityValue;
Nå må vi gi "onClick" -metoden, og legge den til klassen etter "onCreate" -metoden:
offentlig ugyldig onClick (Vis v)
Innenfor metoden må vi avgjøre hvilken knapp som ble klikket med en betinget:
hvis (v.getId () == R.id.ambient_btn) // omgivelsestemperatur annet hvis (v.getId () == R.id.light_btn) // light annet hvis (v.getId () == R.id.pressure_btn) // trykk annet hvis (v.getId () == R.id.humidity_btn) // fuktighet
Inne i hver av disse vil vi forsøke å hente de relevante miljødataene.
Øverst i klassen legger du til et par variabler for miljøavlesingsprosessen:
privat SensorManager senseManage; privat sensor envSense;
Tilbake i "onCreate" -metoden, etter den eksisterende koden, legger du til følgende for å opprette en forekomst av Sensor Manager-klassen:
senseManage = (SensorManager) getSystemService (Context.SENSOR_SERVICE);
Vi trenger Sensor Manager for alle miljøprosesseringsprosesser. Vi bruker den til å hente bestemte sensorer. Inne i "onClick" -metoden "hvis" -oppsettet for omgivelsestemperatur, forsøk å hente omgivelsestemperaturføleren som følger:
envSense = senseManage.getDefaultSensor (Sensor.TYPE_AMBIENT_TEMPERATURE);
Nå må vi ta vare på tilfeller hvor sensoren ikke er gitt av brukerenheten, så legg til følgende test:
if (envSense == null) Toast.makeText (this.getApplicationContext (), "Beklager - enheten din har ikke en omgivelsestemperatur sensor!", Toast.LENGTH_SHORT) .show ();
Vi sender ut en feilmelding. Hvis sensoren er til stede, må vi registrere deg for å motta dataene den returnerer, så legg til følgende etter denne "if" -oppstillingen:
ellers senseManage.registerListener (dette, envSense, SensorManager.SENSOR_DELAY_NORMAL);
Nå utfør samme prosess for hver av knappene i "onClick" -metoden. For lysknappen (i sin "if" -oppgave inni "onClick"):
envSense = senseManage.getDefaultSensor (Sensor.TYPE_LIGHT); if (envSense == null) Toast.makeText (this.getApplicationContext (), "Beklager - enheten din har ikke en lyssensor!", Toast.LENGTH_SHORT) .show (); ellers senseManage.registerListener (dette, envSense, SensorManager.SENSOR_DELAY_NORMAL);
Legg merke til at vi her ber om "TYPE_LIGHT" -sensoren og skredder feilmeldingen til sensortypen. For trykknapp:
envSense = senseManage.getDefaultSensor (Sensor.TYPE_PRESSURE); if (envSense == null) Toast.makeText (this.getApplicationContext (), "Beklager - enheten din har ikke en trykksensor!", Toast.LENGTH_SHORT) .show (); ellers senseManage.registerListener (dette, envSense, SensorManager.SENSOR_DELAY_NORMAL);
Til slutt, i "if" -oppgaven for fuktighetsknappen:
envSense = senseManage.getDefaultSensor (Sensor.TYPE_RELATIVE_HUMIDITY); if (envSense == null) Toast.makeText (this.getApplicationContext (), "Beklager - enheten din har ingen fuktighetssensor!", Toast.LENGTH_SHORT) .show (); ellers senseManage.registerListener (dette, envSense, SensorManager.SENSOR_DELAY_NORMAL);
I tillegg til å returnere de forespurte miljødataene, vil sensoren også returnere nøyaktighetsdata. Legg til følgende metode i klassen din, som kreves når du implementerer Sensor Event Listener Interface:
@Overgå offentlig sluttgyldighet on AccuracyChanged (Sensor sensor, int nøyaktighet)
Inne i metoden, begynn å bygge en melding om nøyaktigheten:
String accuracyMsg = "";
Vi vil bruke en bryteretning på parameteren for passert nøyaktighetsgrad:
bytt (nøyaktighet) case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: accuracyMsg = "Sensor har høy nøyaktighet"; gå i stykker; case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM: accuracyMsg = "Sensor har middels nøyaktighet"; gå i stykker; case SensorManager.SENSOR_STATUS_ACCURACY_LOW: accuracyMsg = "Sensor har lav nøyaktighet"; gå i stykker; case SensorManager.SENSOR_STATUS_UNRELIABLE: accuracyMsg = "Sensor har upålitelig nøyaktighet"; gå i stykker; standard: break;
Vi skredder meldingen til sensorens nøyaktighetsnivå, ved hjelp av Sensor Manager-klassen. Utfør nøyaktigheten når den mottas som følger, men etter bryteretningen:
Toast-nøyaktighetToast = Toast.makeText (this.getApplicationContext (), accuracyMsg, Toast.LENGTH_SHORT); accuracyToast.show ();
I "OnAccuracyChanged" -metoden kan du også bestemme sensortypen fra den overførte parameteren hvis du trenger det.
Nå kan vi endelig hente de returnerte dataene fra sensorene ved hjelp av en Sensor Event - vi gjør dette i "onSensorChanged" -metoden, som også kreves for å implementere grensesnittet:
@Overtrid offentlig sluttgyldighet på SensorChanged (SensorEvent-hendelse)
Sensorhendelsen returnerer dataene på forskjellige måter avhengig av sensortypen. For alle fire typer vi bruker, blir den hentet på samme måte, fra det første elementet i en rekke flytende punktverdier. Legg til følgende inne i metoden:
float sensorValue = event.values [0];
Vi skal nå bygge en tekst String, inkludert disse dataene, og skrive den til den aktuelle tekstvisningen for brukeren å se. Først oppretter vi en variabel for tekstvisning og gir den en standardverdi (denne verdien vil bli overskrevet - vi inkluderer den for å holde Eclipse glad):
TextView currValue = ambientValue;
Deretter erklærer vi strengen:
string;
Strengenes innhold kommer til å stole på typen av sensor, så la oss finne ut hvilken som er den:
int currType = event.sensor.getType ();
Nå kan vi bruke en bryteretning på denne verdien:
bytt (currType) case Sensor.TYPE_AMBIENT_TEMPERATURE: envInfo = sensorValue + "grader Celsius"; currValue = valueFields [omgivelsene]; gå i stykker; case sensor.TYPE_LIGHT: envInfo = sensorValue + "SI lux enheter"; currValue = valueFields [Lys]; gå i stykker; case sensor.TYPE_PRESSURE: envInfo = sensorValue + "hPa (millibars)"; currValue = valueFields [TRYKK]; gå i stykker; case sensor.TYPE_RELATIVE_HUMIDITY: envInfo = sensorValue + "prosent fuktighet"; currValue = valueFields [HUMIDITY]; gå i stykker; standard: break;
I hvert tilfelle bygger vi den informative Strengen ved hjelp av sensorverdien hentet og et tekstutdrag som er relevant for typen. Vi stiller også tekstvisningen til det relevante brukergrensesnittet ved hjelp av array og konstanter. Etter bryteretningen, skriv ut informasjonen:
currValue.setText (envInfo);
Nå tilbakestill sensorvariabelen og slutte å lytte etter oppdateringer for å forhindre unødig batteribruk:
envSense = null; senseManage.unregisterListener (this);
Til slutt vil vi ikke at appen skal bruke unødvendige ressurser når den er pauset, så legg denne metoden til klassen:
@Override protected void onPause () super.onPause (); senseManage.unregisterListener (this);
Det er den komplette demonstrasjonsapp! Det er ikke noe poeng å kjøre denne appen på standard Android-emulatoren, fordi den ikke gir miljøsensorer. Du kan imidlertid enten kjøre den på en faktisk enhet eller bruke Sensor Simulator-verktøyet, som lar deg simulere bestemte aspekter av miljøet. Følgende er et skjermbilde av appen som kjører på Samsung Galaxy S III like etter å ha hentet lys- og trykkdataene:
Her er det for de andre to sensorene, som ikke støttes:
Miljøsensorene er en spennende, men fortsatt utviklende funksjon av Android-plattformen. Det er imidlertid litt tidlig å fokusere på dem. Hvis du vil utforske disse sensorene på mer avanserte måter, kan du se gjennom utviklingsveiledningen for beregning av duggpunkt og absolutt fuktighetsnivå basert på relativ fuktighet og omgivelsestemperatur. Annet enn det - prøv å være tålmodig!