Windows Phone 8 Succinctly: Integrering Med Hardware
24
Del
en
Del
Denne Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Windows Phone 8 Succinctly.Windows Phone 8 Succinctly. Data Access-NetworkWindows Phone 8 Succinctly: Integrering med operativsystem
I denne artikkelen, er vi skal utforske hvordan du kan gjøre bruk av maskinvare egenskapene til en Windows Phone-enhet, for eksempel geolocation, enhets sensorer, Bluetooth og NFC.
Geolocation
Alle Windows Phone-enheter har inne i geolocation maskinvare. Ved å bruke en kombinasjon av 3G, Wi-Fi, og GPS-signalet, er i stand til å identifisere hvor brukeren befinner seg og gjøre den tilgjengelig for hver app, takket være et sett med APIer inkludert i Windows Runtime telefonen.
Geolocation er et annet scenario der APIer er duplisert. Den opprinnelige API sett var en del av Silverlight rammeverk, men det har blitt utvidet i Windows Runtime.
Den nye hovedklassen for å arbeide med geolocation tjenester kalles Geolocator, og det er en del av Windows.Devices.Geolocation . navnerom
. Merk: For å bruke geolocation tjenester, må du aktivere ID_CAP_LOCATION evne i manifestfilen
Det første trinnet å bruke geolocation tjenester er å sjekke LocationStatus eiendomsverdi på den Geolocator klassen til å identifisere den nåværende status av tjenestene. Spesielt må vi forvalte PositionStatus.Disabled status. I dette tilfellet har brukeren deaktivert geolocation tjenester i telefonens innstillinger, slik at vi ikke trenger å utføre noen operasjon relatert til geolocation, ellers vil vi få et unntak.
Hvis du ønsker å holde styr på geolocation tjenestens status, det er en bestemt hendelse handler kalles StatusChanged som påberopes hver gang statusen endres. Det hjelper deg til å identifisere, for eksempel at GPS er klar eller at brukeren er på et sted som er vanskelig å spore
Det er to måter å samhandle med Geolocator klassen. Spør etter en enkelt stilling (for eksempel en Twitter-klient som må geolocalize en tweet), eller abonnere på en hendelseshåndterer som kan brukes til kontinuerlig å spore brukerens plassering (for eksempel en kjører tracker app).
For å be om en enkelt stilling, du bare må ringe asynkron metoden GetGeopositionAsync (). Det vil returnere en Geoposition objekt som inneholder en Koordinere eiendom som vil hjelpe deg å identifisere hvor brukeren er
. Merk: Geoposition objektet har en annen egenskap kalt
CivicAddress
som skal inneholde en referanse til hvor brukeren befinner seg ved hjelp av kommunal referanser (som byen, gateadresse, etc.). Denne egenskapen støttes ikke, så det vil alltid returnere uriktige opplysninger. Senere i denne artikkelen vil vi se på hvordan man kan få kommunal posisjonen til brukeren
Følgende kodeeksempel viser hvordan å få en enkelt brukerens posisjon.
Privat async ugyldig OnGetSinglePositionClicked (objekt avsenderen, RoutedEventArgs e) {Geolocator geolocator = new Geolocator (); if (! geolocator.LocationStatus = PositionStatus.Disabled) {Geoposition geoposition = avvente geolocator.GetGeopositionAsync (); MessageBox.Show (string.Format ("The brukerens koordinater er {0} - {1}", geoposition.Coordinate.Latitude, geoposition.Coordinate.Latitude))}}
For fortløpende å spore brukerens posisjon, i stedet, du trenger å abonnere på PositionChanged hendelseshåndterer, som er påberopt hver gang brukeren beveger seg fra den forrige plasseringen. Du kan kontrollere hvor ofte denne hendelsen heves ved å sette tre egenskapene til Geolocator objekt:
DesiredAccuracy, som er den geolocation nøyaktighet. Jo høyere den er satt, vil den mer presise resultatet bli, og jo mer strøm vil bli fortært.
ReportInterval, som er det minste antall millisekunder som skal passere mellom to påvisninger.
PositionChanged hendelsen returnerer en parameter som inneholder en posisjon egenskap av type Geoposition- . det fungerer på samme måte som vi tidligere har sett for GetGeopositionAsync () -metoden
private void OnStartTrackingPosition (objekt avsenderen, RoutedEventArgs e) {Geolocator geolocator = new Geolocator (); geolocator.MovementThreshold = 100; geolocator.ReportInterval = 1000; geolocator.DesiredAccuracy = PositionAccuracy.High; geolocator.PositionChanged + = geolocator_PositionChanged;} private void geolocator_PositionChanged (Geolocator avsender, PositionChangedEventArgs args) {Dispatcher.BeginInvoke (() = > {Latitude.Text = args.Position.Coordinate.Latitude.ToString (); Longitude.Text = args .Position.Coordinate.Longitude.ToString ();});}
I forrige prøven, vi spore brukerens plassering hver gang han eller hun beveger seg 100 meter fra den forrige plasseringen, bare hvis minst ett sekund har gått siden forrige deteksjon. Hver gang PositionChanged hendelsen er hevet, vi viser lengde- og breddegrad eiendommenes verdier i to forskjellige TextBlock kontroller. Legg merke til at vi bruker den Dispatcher klassen vi diskutert tidligere i denne serien. Det er nødvendig fordi PositionChanged hendelsen forvaltes på en bakgrunnstråd, så vi er ikke i stand til å kommunisere direkte med UI
. Tips: Du kan enkelt teste geolocation tjenester ved hjelp av verktøy som kommer med emulator. Klikk på en posisjon på kartet og de relaterte koordinater vil bli sendt til emulator.
Bakgrunn Sporing
Windows Phone 8 har innført muligheten til å holde sporing brukerens posisjon når Søknaden er suspendert. Dette betyr at PositionChanged hendelsesbehandling vil fortsatt kunne påberopes selv om programmet ikke kjører i forgrunnen
Bakgrunn sporing kan fortsette med mindre:.
programmet har kjørt i bakgrunnen i fire timer uten å bli gjenåpnet
Sparemodus er aktivert
telefonen kjører ut av ledig minne
geolocation tjenester har blitt deaktivert
brukeren åpner et annet program som er i stand til å spore hans eller hennes plassering i bakgrunnen
For å aktivere bakgrunns sporing, må du redigere manifestfilen bruke manuell editor (høyreklikk på filen og velg Vis code) da opsjonen ikke støttes av den visuelle editor. Du må redigere DefaultTask node på følgende måte:
< Oppgaver > < DefaultTask Name = "_ default" NavigationPage = "MainPage.xaml" > < BackgroundExecution > < ExecutionType Name = "LocationTracking" /> < /BackgroundExecution > < /DefaultTask > < /Oppgaver >
Nå, hvis de tidligere vilkårene er oppfylt, vil programmet fortsette å spore hvor brukeren befinner seg, selv når den ikke kjører i forgrunnen
Hvis du vil tilpasse. brukeropplevelsen basert på om programmet kjører i bakgrunnen, kan du abonnere på en bestemt hendelse av PhoneApplicationService objektet, som er erklært i App.xaml filen, og som vi har lært å bruke tidligere i denne serien. Hendelsesbehandling kalles RunningInBackground og det har utløst hver gang programmet er suspendert. . Men siden det er ved hjelp geolocation tjenester, vil det fortsette å kjøre i bakgrunnen
I det følgende prøve, kan du se hvordan PhoneApplicationService erklæringen vil se etter at vi har abonnert på hendelsen:
< Application.ApplicationLifetimeObjects > <! - Må objekt som håndterer levetid hendelser for søknaden - > < shell: PhoneApplicationService Lansering = "Application_Launching" Closing = "Application_Closing" Aktivert = "Application_Activated" Deaktivert = "Application_Deactivated" RunningInBackground = "Application_RunningInBackground" /></Application.ApplicationLifetimeObjects>
In forrige prøven, setter vi en eiendom (kalt IsRunningInBackground) for å få vite om programmet kjører i bakgrunnen. Vi setter den til true når RunningInBackground hendelsen utløses, og sett den til false når Aktivert hendelsen er hevet, noe som betyr at programmet har blitt gjenåpnet.
samspill med Map Control
Windows Phone har en innebygd Kart kontroll som kan brukes til å legge inn et kart inne en søknad side og kan brukes i kombinasjon med geolocation tjenester. Kontrollen har blitt kraftig forbedret siden Windows Phone 7, og det er nå basert på Nokias kartografi. I tillegg støtter den offline kart-hvis brukeren har lastet ned kart for gjeldende sted, vil kontrollen være i stand til å automatisk bruke dem. Kart kontroll er en del av Microsoft.Phone.Maps.Controls namespace, så må du legge det til i XAML side før du bruker it:
xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"
The Kart kontroll avdekker mange eiendommer for tilpasning. Den mest nyttige er:
Center, koordinerer geolocation kartet er sentrert på
ZoomLevel, som er zoomnivå fra 1 (minimum) til 19 (maks)..
CartographicMode, som kan brukes til å bytte mellom Aerial (satellitt visning), Road (vei visning), Terreng (liggende visning), og Hybrid (en kombinasjon av de andre).
ColorMode kan brukes til å sette et lys eller mørkt tema, i henhold til lysstyrke forholdene
I det følgende prøve, kan du se en kart-kontroll inkludert i en side.
< Kart: Kart x: Name = "CustomMap" ZoomLevel = "15" CartographicMode = "Aerial" ColorMode = "Light" />
Å bruke kartet kontroll i kombinasjon med geolocation tjenester skal være enkelt: det ville være nok til å satt Senter eiendom kartet med en Geoposition objekt som returneres av Geolocator klassen. Dessverre, det er en begrensning siden Windows Phone og Kart-kontroll bruke to forskjellige klasser å lagre geolocation koordinater. Den første heter Geocoordinate og det er en del av Windows.Devices.Geolocation navnerom, mens den andre kalles GeoCoordinate (med stor K), og det er en del av System.Device.Location navnerom.
Heldigvis , det er en work-around: installere Windows Phone Toolkit vi diskutert tidligere i denne serien. I tillegg til å gi en nyttig sett med flere kontroller, det tilbyr også mange hjelpere og utvidelser som er nyttige når du arbeider med Map kontroll.
Spesielt etter tilsetting av Windows Phone Toolkit til prosjektet (den enkleste måten er bruker nuget), vil du kunne bruke en utvidelse metode som kalles ToGeoCoordinate (), som er i stand til å konvertere den opprinnelige Windows Runtime klasse til Map kontrollens bestemt en. I følgende eksempel, kan du se hvordan vi bruker den til å vise brukerens nåværende posisjon på et kart:
privat async void OnGetSinglePositionClicked (objekt avsenderen, RoutedEventArgs e) {Geolocator geolocator = new Geolocator (); if (! geolocator.LocationStatus = PositionStatus.Disabled) {Geoposition geoposition = avvente geolocator.GetGeopositionAsync (); myMap.Center = geoposition.Coordinate.ToGeoCoordinate (); }}
Layers
Kart kontroll støtter lag som kan legges på toppen av kartet. Et lag er en samling av visuelle objekter som vises over kartet, og det er representert ved MapLayer klassen
Hver MapLayer har en samling av overlegg (den MapOverlay klasse).; hver og en er et objekt som vises på kartet.
Et overlegg kan bestå av praktisk talt alle kontroll. Faktisk er det definert av en posisjon ved hjelp av GeoCoordinate eiendom, og innhold via Content eiendommen, som er et generelt objekt. Dette betyr at du kan legge til objektet du vil som innhold, som med noen av de XAML visuelle kontrollene som er tilgjengelige i rammeverket.
I følgende eksempel, skaper vi et rektangulært objekt og angi det som innholdet på en MapOverlay objekt som vi legger til et nytt lag.
private void OnAddShapeClicked (objekt avsenderen, RoutedEventArgs e) {MapOverlay overlegg = new MapOverlay {GeoCoordinate = myMap.Center, Content = new rektangel {Fyll = nye SolidColorBrush (Colors. blå), Bredde = 40, Høyde = 40}}; MapLayer lag = new MapLayer (); layer.Add (overlay); myMap.Layers.Add (lag);}
Ruting
Et vanlig scenario der du jobber med Map kontrollen er med ruting, hvor du har muligheten til å vise rutene på kartet. Selv om det høres komplisert ut, er det enkelt å implementere bruker RouteQuery klassen, som lar deg:
sette ulike rutealternativer ved hjelp av TravelMode og RouteOptimization egenskaper
legge til en liste over veipunkter som komponerer ruten
Følgende kode viser en routing prøve:
private void OnCalculateRouteClicked (objekt avsenderen, RoutedEventArgs e) {RouteQuery query = ny RouteQuery {TravelMode = TravelMode.Driving , RouteOptimization = RouteOptimization.MinimizeTime,}; List < GeoCoordinate > koordinerer = new List < GeoCoordinate > (); coordinates.Add (ny GeoCoordinate (47,6045697927475, -122,329885661602)); coordinates.Add (ny GeoCoordinate (47,605712890625, -122,330268859863)); query.Waypoints = koordinater; query.QueryCompleted + = query_QueryCompleted; query.QueryAsync ();}
TravelMode og RouteOptimization alternativer kan brukes til å tilpasse ruten på en måte som ligner på det mange GPS-navigatorer gjør. I forrige prøven, ønsker vi den kjørerute som krever minst mulig tid.
Banen er satt ved hjelp av veipunkter eiendom, noe som krever en samling av GeoCoordinate stedene. Hvert objekt representerer et punkt i banen som skal bli berørt av ruten.
RouteQuery klassen arbeider med tilbakeringing tilnærming. Vi kaller det QueryAsync () metoden og abonnere på QueryCompleted arrangementet, som utløses når ruten er beregnet, som vist i følgende eksempel:
void query_QueryCompleted (objekt avsenderen, QueryCompletedEventArgs < Route > e) { Rute rute = new Rute (e.Result); myMap.AddRoute (rute);}
Vise en rute på kartet kontrollen er enkel du bare må lage en ny Rute objekt, passerer spørreresultat (lagret i Resultat tilhører den returnerte objekt) som en parameter, og legge den til i kart ved hjelp av AddRoute () -metoden.
Arbeide med koordinater
Til nå har vi alltid jobbet med geolocation koordinater basert på lengde- og breddegrad, men ofte det er enklere for brukerne å forstå en plassering basert på sin civic adresse. Windows Phone 8 har lansert to klasser for å utføre geokoding konvertering:. GeoCodeQuery (for å konvertere en adresse i et sett av numeriske koordinater) og ReverseGeocodeQuery (for å konvertere lengde- og breddegrad til en adresse)
De har begge arbeidet i samme måte, siden de bruker den samme tilbakeringing tilnærmingen vi har sett for ruting. Etter at du har definert operasjon å utføre, kan du starte søk ved hjelp av QueryAsync () -metoden. Når søket er fullført, kan du bruke QueryCompleted hendelseshåndterer å administrere resultatene
GeocodeQuery klassen krever at du sette to parametere:. GeoCoordinate og, viktigst, SEARCH, som er søkeordet. GeoCoordinate bør ikke være nødvendig (siden hensikten med denne klassen er å finne plasseringen koordinatsystem), men du må sette den likevel med en falsk verdi som vist i følgende eksempel. Ellers vil du ikke få noe resultat.
Private void OnResolveCoordinatesClicked (objekt avsenderen, RoutedEventArgs e) {GeocodeQuery query = ny GeocodeQuery {GeoCoordinate = new GeoCoordinate (0, 0), SEARCH = "Milano, Italia" }; query.QueryCompleted + = query_QueryCompleted; query.QueryAsync ();}
ReverseGeoCodeQuery klasse, i stedet krever bare GeoCoordinate eiendom skal settes med plasseringen koordinater
private void OnResolveAddressClicked (objekt avsenderen, RoutedEventArgs e) {ReverseGeocodeQuery reverseQuery = ny. ReverseGeocodeQuery {GeoCoordinate = new GeoCoordinate (45,3967, 9,3163)}; reverseQuery.QueryCompleted + = reverseQuery_QueryCompleted; reverseQuery.QueryAsync ();}
QueryCompleted hendelseshåndterer er den samme for begge klasser og returnerer en samling av MapLocation stedene. Hvis du brukte GeocodeQuery klassen, vil du sannsynligvis være interessert i GeoCoordinate objekt, som inneholder breddegrad og lengdegrad for søkte plasseringen
void query_QueryCompleted (objekt avsenderen, QueryCompletedEventArgs. ≪ IList < MapLocation > > e ) {var element = e.Result.FirstOrDefault (); myMap.SetView (item.BoundingBox, MapAnimationKind.Parabolic);.}
Den forrige prøven viser en måte å sentrere kartet på stillingen returneres av tjenesten
I stedet hvis du brukte ReverseGeocodeQuery klassen, du finner den informasjonen du leter etter i informasjons eiendommen som inneholder data som City, Gate, Adresse, etc.
void reverseQuery_QueryCompleted (objekt avsenderen, QueryCompletedEventArgs < IList < MapLocation > > e) { Var element = e.Result.FirstOrDefault (); MessageBox.Show (string.Format ("{0} {1}", item.Information.Address.Street, item.Information.Address.City));}
I begge tilfeller, returnerer hendelseshåndterer en samling av MapLocation objekter fordi, spesielt hvis du søkte et sted ved et søkeord, kan tjenesten returnere flere resultater. Den forrige eksemplet viser informasjon om det første elementet i samlingen.
Slik publiserer et program som bruker Map Control
Du kan fritt bruke Map kontroll under testfasen, men når du sender det til butikken, du trenger produksjons legitimasjon.
De legitimasjon kan oppnås i løpet av innsendingsprosessen. En av de valgfrie trinnene kalles karttjeneste, som vil gi deg to koder kalt ApplicationId og AuthenticationToken. Når du har kodene, må du sette dem på følgende måte når programmet starter:
Microsoft.Phone.Maps.MapsSettings.ApplicationContext.ApplicationId = "ApplicationId"; Microsoft.Phone.Maps.MapsSettings. ApplicationContext.AuthenticationToken = "AuthenticationToken";
bevegelsessensorer
Windows Phone-enheter har mange bevegelsessensorer som kan brukes av applikasjoner, som akselerometer, gyroskop og kompass. Windows Runtime har innført et nytt sett med APIer som er en del av Windows.Devices.Sensors navnerom.
Gyrometer klassen kan brukes til å samhandle med gyroskop.
Compass klassen kan brukes til å samhandle med kompasset.
OrientationSensor er en spesiell klasse som kan kombinere verdier hentet fra alle tilgjengelige sensorer .
Merk: For å bruke sensorer, må du aktivere ID_CAP_SENSORS alternativ i manifestfilen. Hvis du også ønsker å bruke gyroskop og kompass, må du aktivere ID_REQ_MAGNETOMETER og ID_REQ_GYROSCOPE evner i Krav delen av manifestfilen. På denne måten vil brukere med enheter uten en av disse sensorene ikke være i stand til å laste ned applikasjonen.
Alle sensorene fungerer på samme måte. Du vil være i stand til å få en henvisning til sensoren ved hjelp av GetDefault () -metoden. Hvis det ikke er tilgjengelig på telefonen (for eksempel ikke alle enheter har et gyroskop), vil du få en nullreferanse i retur. Det er viktig å alltid sjekke om det returnerte sensoren er null før du gjør enhver operasjon
I likhet med geolocation tjenester, har du to måter å samhandle med sensorer.
den ReadingChanged hendelseshåndterer som utløses hver gang telefonen flyttes til en ny posisjon
I denne delen vil vi bruke som et eksempel OrientationSensor klasse, som er en spesiell sensor som er i stand til å kombinere alle de verdiene som returneres av de tilgjengelige sensorer og automatisk filtrere alle out-of-skala data. Klassen returnerer en OrientationSensorReading objekt, som inneholder all informasjon om den aktuelle posisjonen. Du vil være i stand til å få enheten posisjon ved hjelp av quaternion og RotationMatrix egenskaper.
I de følgende eksempler, kan du se to måter å oppnå det samme resultatet: Få en enkel lesing, og abonnere på meldinger som sendes hver gang posisjonsendringer. Enhetens koordinater på x-aksen, y-aksen og z-aksen vises på skjermen ved hjelp av tre TextBlock kontroller:
//Enkelt reading.private void OnGetReadingClicked (objekt avsenderen, RoutedEventArgs e) {OrientationSensor orientationSensor = OrientationSensor.GetDefault (); if (! orientationSensor = null) {OrientationSensorReading lesing = orientationSensor.GetCurrentReading (); txtX.Text = reading.Quaternion.X.ToString (); txtY.Text = reading.Quaternion.Y.ToString (); txtZ.Text = reading.Quaternion.Z.ToString (); } Else {MessageBox.Show ("Sensoren er ikke tilgjengelig"); }} //Kontinuerlig reading.private void OnGetReadingClicked (objekt avsenderen, RoutedEventArgs e) {OrientationSensor orientationSensor = OrientationSensor.GetDefault (); if (orientationSensor = null) {orientationSensor.ReadingChanged + = orientationSensor_ReadingChanged; } Else {MessageBox.Show ("Sensoren er ikke tilgjengelig"); }} void orientationSensor_ReadingChanged (OrientationSensor avsenderen, OrientationSensorReadingChangedEventArgs args) {Dispatcher.BeginInvoke (() = > {txtX.Text = args.Reading.Quaternion.X.ToString (); txtY.Text = args.Reading.Quaternion.Y. toString (); txtZ.Text = args.Reading.Quaternion.Z.ToString ();});}
Vær oppmerksom på at hvis du bestemmer deg for å abonnere på ReadingChanged arrangementet, trenger du en Dispatcher å kommunisere med brukergrensesnitt siden hendelseshåndterer er administrert av en bakgrunnstråd.
Hvis du trenger å bruke en bestemt sensor, er koden til å bruke veldig like. Du vil rett og slett nødt til å bruke bestemte sensor klasse og administrere spesifikke lese objekt som du får i retur
. Tips: Windows Phone emulator har et verktøy for å simulere bevegelsessensorer . Dessverre er bare akselerometeret er understøttet; for hver annen sensor, inkludert OrientationSensor, trenger du en reell enhet.
Bestemme Current Hardware
Windows Phone tilbyr en klasse kalt device som kan brukes for å få informasjon om gjeldende enhet, som:
firmware-versjonen, med DeviceFirmwareVersion eiendom
hardware versjon, med DeviceHardwareVersion eiendom
produsenten, med DeviceManufacturer eiendom
enhetsnavnet, med enhetsnavn eiendom
mengden totalt minne tilgjengelig, med DeviceTotalMemory eiendommen
I tillegg har du tilgang til noen nyttige APIer for å få gjeldende status for batteriet. De tilhører den Windows.Phone.Devices.Power navnerom, og du vil være i stand til å bruke batteriet klassen til å identifisere hvor mange prosent av gjenværende batterilading (med RemainingChargePercent eiendom) og gjenværende tid før batteriet helt utslipp (med RemainingDischargeTime eiendom)
The Battery klassen oppfører seg som en sensor.; du må bruke GetDefault () metode for å få en henvisning til det (selv om det i dette tilfellet, kan du unngå å sjekke om det returnerte objektet er null siden hver telefonen har et batteri), som i følgende eksempel:
private void OnGetBatteryClicked (objekt avsenderen, RoutedEventArgs e) {int remainingCharge = Battery.GetDefault () RemainingChargePercent.; Timespan remainingTime = Battery.GetDefault () RemainingDischargeTime;.}
I tillegg device klassen har en egenskap kalt drivkreftene, som forteller deg dagens strømkilden, og en hendelseshåndterer, kalt PowerSourceChanged, som utløses hver gang den aktuelle . strømkilde endringer (fra batteriet til eksterne eller vice versa)
private void OnGetBatteryClicked (objekt avsenderen, RoutedEventArgs e) {DeviceStatus.PowerSourceChanged + = DeviceStatus_PowerSourceChanged;} void DeviceStatus_PowerSourceChanged (objekt avsenderen, EventArgs e) {string melding = DeviceStatus.PowerSource == PowerSource.Battery? "Batteria": "Alimentazione di rete"; MessageBox.Show (melding);.}
Det kan være nyttig hvis du for eksempel ønsker å unngå å utføre kraftkrevende operasjoner hvis telefonen ikke er koblet til en ekstern strømkilde
Merk: For å få tilgang til maskinvare info, må du aktivere ID_CAP_IDENTITY_DEVICE evne i manifestfilen
Nærhet
Under nærhet kategorien vi. kan omfatte alle de nye APIer som har blitt introdusert i Windows Runtime å koble to enheter sammen uten å bruke en Internett-tilkobling. I Windows Phone kan du oppnå dette resultatet ved å bruke to teknologier:. Bluetooth og NFC
Bluetooth er godt kjent og kan brukes til å koble til enheter innenfor et område på 10 meter. Det har vært tilgjengelig siden den første Windows Phone utgivelse, men bare Windows Phone 8 har innført APIer som er tilgjengelig for utviklere.
NFC er en nyere teknologi som har begynt å få litt trekkraft i de siste årene. Den kan brukes til å utveksle små mengder av data innenfor et nært område (de to enheter skal i utgangspunktet berører hverandre). NFC er en interessant teknologi siden det fungerer ikke bare med aktive enheter (som to telefoner), men også med passive enheter (som chips innebygd i et klistremerke eller i et magasin side). I tillegg er Windows Phone stand til å utvide NFC og bruke den til å skape et Bluetooth kommunikasjonskanal uten å måtte koble de to enhetene manuelt. På denne måten kan du overvinne NFC begrensninger og bruke Bluetooth til å overføre større datafiler, som bilder
. Merk: For å bruke Nærhets APIer, må du aktivere ID_CAP_PROXIMITY alternativet i manifest fil.
Den enkleste måten å teste applikasjoner som bruker avstands APIer er med reelle enheter, men det er også et tredjepartsverktøy kalt Proximity Tapper tilgjengelig på CodePlex som kan brukes til å simulere sammenhengen mellom ulike emulatorer (siden Visual Studio er i stand til å kjøre bare én bestemt emulator på en gang, må du bruke forskjellige emulator versjoner, for eksempel en WVGA og en WXGA en).
Utveksle meldinger
Et vanlig scenario når du arbeider med NFC er utveksling av meldinger, noe som representerer en liten mengde data. Det er noen standardmeldinger som Windows Phone er i stand til å håndtere automatisk (for eksempel når du mottar en URI eller en kontakt), og noen egendefinerte meldinger som kan styres bare av tredjeparts applikasjoner.
Den første trinn, som med alle andre sensor vi har sett så langt, er å bruke GetDefault () metoden i ProximityDevice klassen for å få tilgang til nærhetssensor. I dette tilfellet, må vi også sjekke om sensoren referanse er null før du går videre, siden enkelte enheter ikke støtter NFC.
Hver melding er identifisert av et bestemt søkeord. Windows Phone-APIer innebygd støtte tre meldingstyper-tekst, URI, og binære. La oss se hvordan å håndtere dem.
Tekstmeldinger
Publisering en tekstmelding er enkelt. Vi bruker PublishMessage () metoden i ProximityDevice klassen, som krever meldingstypen og innholdet som parametrene. I følgende eksempel, kan du se hvordan vi sende en tekstmelding, identifisert av Windows.SampleMessage søkeord
private void OnSendMessageClicked (objekt avsenderen, RoutedEventArgs e) {ProximityDevice device = ProximityDevice.GetDefault (.); if (! device = null) {device.PublishMessage ("Windows.SampleMessage", "Sample meldingen", MessageSent); }} private void MessageSent (ProximityDevice avsender, lang messageId) {MessageBox.Show ("Meldingen er sendt"); sender.StopPublishingMessage (messageId);}
Som du kan se, godtar PublishMessage () -metoden en tredje, valgfritt parameter, som er en hendelse som er hevet når meldingen er mottatt av den andre enheten. Dette arrangementet kan være nyttig, som vist i den foregående prøve, for å slutte å sende meldingen når den er mottatt ved å ringe StopPublishingMessage () metoden på ProximityDevice objektet. Du må sette meldingen ID, som er vedtatt som en parameter til metoden.
Telefonen mottar meldingen bør i stedet ringe SubscribeForMessage () -metoden. I motsetning til publisering metoden, er denne metoden den samme uavhengig av de dataene vi forventer. Forskjellen er at i henhold til meldingen, kan vi bruke noen spesifikke egenskaper for å analysere den og trekke ut den informasjonen vi trenger.
I følgende eksempel kan du se hvor det er lett å trekke ut meldingsinnholdet takket være DataAsString eiendommen av ProximityMessage Klasse:
private void OnReadMessageClicked (objekt avsenderen, RoutedEventArgs e) {ProximityDevice device = ProximityDevice.GetDefault (); if (! device = null) {device.SubscribeForMessage ("Windows.SampleMessage", messageReceived); }} private void messageReceived (ProximityDevice avsender, ProximityMessage melding) {Dispatcher.BeginInvoke (() = > {MessageBox.Show (message.DataAsString);}); sender.StopSubscribingForMessage (message.SubscriptionId);}
Denne koden er ikke veldig forskjellig fra den koden som brukes til å sende meldingen; den SubscribeForMessage () metoden krever meldingstypen og hendelseshåndterer som startes når meldingen er mottatt.
Meldingen er mottatt takket være ProximityMessage objekt som returneres som en parameter. I dette tilfellet, siden det er en tekstmelding, kan vi trekke ut innhold ved hjelp av DataAsString eiendommen. Merk at igjen i denne situasjonen vi kansellere abonnementet ved hjelp av StopSubscribingForMessage () metode, slik at søknaden ikke vil lytte lenger for den innkommende meldingen.
URI
Sende URI fungerer på en lignende måte, bortsett fra at vi må bruke PublishUriMessage () metode som aksepterer Uri sende som parameter. I dette tilfellet, trenger vi ikke å sette meldingstypen siden det er implisitt
private void OnPublishUriClicked (objekt avsenderen, RoutedEventArgs e) {ProximityDevice device = ProximityDevice.GetDefault (.); if (! device = null) {device.PublishUriMessage (ny Uri ("http://wp.qmatteoq.com")); }}
Forskjellen er at Uri meldingene direkte støttet av Windows Phone, så vil du være i stand til å bytte dem uten å bruke en mottaker søknad. Operativsystemet, når den har fått Uri, vil bare spørre brukeren om han eller hun ønsker å åpne nettleseren for å se det.
Men hvis du fortsatt ønsker å administrere Uris i søknaden din, kan du gå i stykker;