Hvordan jobbe med Geofences på Android

Plassbevisste ressurser lar applikasjonen din samhandle med den fysiske verden, og de er ideelle for å øke brukerengasjementet. Selv om mange mobilapper bruker dem, er emnet for denne opplæringen en funksjon som ofte overses, geofencing.

En geofence er en virtuell omkrets satt på et ekte geografisk område. Kombinere en brukerposisjon med en geofence perimeter, er det mulig å vite om brukeren er inne eller utenfor geofence, eller om han er spennende eller kommer inn i området.

Tenk deg et universitetsapp som kan fortelle hvilke kollegaer og professorer som er på campus. Eller en app for et kjøpesenter som belønner vanlige kunder. Det er mange andre interessante muligheter du kan utforske.

I denne opplæringen lærer du hvordan du bruker geofences på Android ved å lage et program som viser brukeren et varsel når de går inn eller ut av en geofence. Det hjelper hvis du har forkunnskaper om Google Play Services, Google Maps Android API, eller IntentService. Hvis du ikke gjør det, kan du fortsatt følge med, men du vil kanskje gjøre noen undersøkelser om disse emnene etter å ha lest denne opplæringen.

1. Geofences på Android

På Android er det flere måter å jobbe med geofences. Du kan til og med lage din egen implementering for å jobbe med geofences, men det er lettere å bruke Googles GeofencingApi.

Disse APIene er en del av Googles plassering APIer. Det inkluderer geofence, GeofencingRequest, GeofenceApiGeofencingEvent, og GeofenceStatusCodes. I denne opplæringen bruker vi disse klassene til å lage og arbeide med geofences.

Geofence Interface

geofence er et grensesnitt som representerer et geografisk område som skal overvåkes. Den er opprettet ved å bruke Geofence.Builder. Under opprettelsen setter du det overvåkede området, geofensens utløpsdato, responsivitet, en identifikator og hva slags overganger den skal se etter.

For å holde strømforbruket på et minimum, anbefales det å bruke en geofence med en radius på minst 100 meter for de fleste situasjoner. Hvis geofences ligger på landsbygda, bør du øke radiusen til 500 meter eller høyere for å sikre at geofvensene er effektive.

Geofence geofence = ny Geofence.Builder () .setRequestId (GEOFENCE_REQ_ID) // Geofence ID .setCircularRegion (LATITUDE, LONGITUDE, RADIUS) // definere gjerdeområde .setExpirationDuration (DURANTION) // utløpsdato // Overgangstyper som den skal se etter .setTransitionTypes (Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .build ();

Geofence Overganger

  • GEOFENCE_TRANSITION_DWELL indikerer at brukeren har angitt området og brukt litt tid der. Det er nyttig å unngå flere varsler når brukeren kommer inn og ut av området for fort. Du kan konfigurere boligtiden ved hjelp av setLoiteringDelay parameter.
  • GEOFENCE_TRANSITION_ENTER Indikerer når brukeren kommer inn i det overvåkede området.
  • GEOFENCE_TRANSITION_EXIT  Indikerer når brukeren utgår fra regionen.

GeofenceRequest

De GeofencingRequest klassen mottar geofences som skal overvåkes. Du kan opprette en forekomst ved å bruke en Bygger, passerer en geofence eller a Liste, og typen melding om å utløse når geofence (e) er opprettet.

GeofencingRequest request = ny GeofencingRequest.Builder () // Varsling å utløse når Geofence er opprettet .setInitialTrigger (GeofencingRequest.INITIAL_TRIGGER_ENTER) .addGeofence (geofence) // legg til en Geofence .build ();

GeofencingApi

De GeofencingApi klassen er inngangspunktet for alle samspill med Googles geofencing-API. Det er en del av plassering APIer og det avhenger av en GoogleApiClient å jobbe. Du vil bruke GeofencingApi å legge til og fjerne geofences.

For å legge til en geofence, ringer du til addGeofence () metode. Den overvåker det oppgitte området ved hjelp av innstillingene som sendes til GeofencingRequest og skyter a PendingIntent når en geofence-overgang, som kommer inn eller ut av området, finner sted.

PendingResult addGeofences (GoogleApiClient klient, GeofencingRequest geofencingRequest, PendingIntent pendingIntent)

For å fjerne geofensen, ringer du removeGeofences (). Du kan enten fjerne geofence ved hjelp av forespørselsidentifikatoren eller dens ventende hensikt.

PendingResult removeGeofences (GoogleApiClient-klient, Liste geofenceRequestIds)
 PendingResult removeGeofences (GoogleApiClient-klient, PendingIntent pendingIntent)

2. Opprette en Geofencing App

I denne opplæringen lager vi et enkelt program som overvåker brukerens plassering og legger inn et varsel når brukeren går inn eller ut av et geofieldt område. Appen består av bare en Aktivitet og en IntentService. Vi tar også en rask titt på Google Kart, GoogleApiClient, og FusedLocationProviderApi, og vi undersøker noen advarsler av geofence API.

Trinn 1: Prosjektoppsett

GeofencingApi er en del av Google Play Services. For å få tilgang til det, må du konfigurere utviklingsmiljøet riktig og opprette en forekomst av GoogleApiClient. Lag et nytt prosjekt med et tomt Aktivitet, rediger prosjektets build.gradle filen som vist nedenfor, og synkroniser prosjektet ditt.

Trinn 2: Tillatelser

Vi må angi de riktige tillatelsene for å opprette og bruke geofences. Legg til følgende tillatelse til prosjektets manifest:

Fra og med Android 6.0 ber appen om tillatelse på kjøretid og ikke under installasjonen. Vi tar opp dette senere i opplæringen.

Trinn 3: Opprette layout

Prosjektet består av en layout, den MainActity oppsett. Den inneholder enhetens nåværende breddegrad og lengdegrad, og a Google Kart fragment som viser geofences og brukerens posisjon.

Siden activity_main.xml er ganske grei, jeg vil bare konsentrere meg om MapFragment element. Du kan se på det ferdige oppsettet i kildefilene i denne opplæringen.

 

Trinn 4: Google Maps API-nøkkel

Siden vi bruker en MapFragment, vi må sette opp og initialisere en Google Kart forekomst. Først må du oppnå en API-nøkkel. Når du har en API-nøkkel, legg den til prosjektets manifest.

La oss begynne med Google Kart forekomst. Implementere GoogleMap.OnMapReadyCallbackGoogleMap.OnMapClickListener, og GoogleMap.OnMarkerClickListenerAktivitet klasse og initialiser kartet.

offentlig klasse MainActivity utvider AppCompatActivity implementerer OnMapReadyCallback, GoogleMap.OnMapClickListener, GoogleMap.OnMarkerClickListener privat statisk endelig streng TAG = MainActivity.class.getSimpleName (); privat TextView textLat, textLong; privat MapFragment mapFragment; privat GoogleMap-kart @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); textLat = (TextView) findViewById (R.id.lat); textLong = (TextView) findViewById (R.id.lon); // initialiser GoogleMaps initGMaps ();  // Initialiser GoogleMaps private void initGMaps () mapFragment = (MapFragment) getFragmentManager (). FindFragmentById (R.id.map); mapFragment.getMapAsync (this);  // Tilbakeringing kalt når Kart er klar @Override public void onMapReady (GoogleMap googleMap) Log.d (TAG, "onMapReady ()"); map = googleMap; map.setOnMapClickListener (this); map.setOnMarkerClickListener (this);  // Tilbakeringing kalt når kartet berøres @Override public void onMapClick (LatLng latLng) Log.d (TAG, "onMapClick (" + latLng + ")");  // Tilbakeringing ringt når Marker er berørt @ Overstyr offentlig boolean onMarkerClick (Marker markør) Log.d (TAG, "onMarkerClickListener:" + markør.getPosition ()); returner falsk; 

Trinn 5: GoogleApiClient

For å bruke GeofencingApi grensesnitt, trenger vi en GoogleApiClient inngangspunkt. La oss implementere en GoogleApiClient.ConnectionCallbacks og a GoogleApiClient.OnConnectionFailedListenerAktivitet som vist under.

offentlig klasse MainActivity utvider AppCompatActivity implementerer GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, OnMapReadyCallback, GoogleMap.OnMapClickListener, GoogleMap.OnMarkerClickListener // ... privat GoogleApiClient googleApiClient; @Override protected void onCreate (Bundle savedInstanceState) // ... // opprett GoogleApiClient createGoogleApi ();  // Opprett GoogleApiClient-forekomst privat tomt createGoogleApi () Log.d (TAG, "createGoogleApi ()"); hvis (googleApiClient == null) googleApiClient = ny GoogleApiClient.Builder (dette) .addConnectionCallbacks (denne) .addOnConnectionFailedListener (dette) .addApi (LocationServices.API) .build ();  @Override protected void onStart () super.onStart (); // Ring GoogleApiClient-tilkobling når du starter aktiviteten googleApiClient.connect ();  @Override protected void onStop () super.onStop (); // Koble GoogleApiClient fra når du stopper aktivitet googleApiClient.disconnect ();  // GoogleApiClient.ConnectionCallbacks connected @Override public void onConnected (@Nullable Bundle Bundle) Log.i (TAG, "onConnected ()");  // GoogleApiClient.ConnectionCallbacks suspendert @Override public void onConnectionSuspended (int i) Log.w (TAG, "onConnectionSuspended ()");  // GoogleApiClient.OnConnectionFailedListener mislykkes @Override public void onConnectionFailed (@NonNull ConnectionResult connectionResult) Log.w (TAG, "onConnectionFailed ()");  

Trinn 6: FusedLocationProviderApi

Vi må også få tilgang til brukerens nåværende sted. De FusedLocationProviderApi grensesnitt gir oss denne informasjonen og gir et stort nivå av kontroll over lokasjonsforespørselen. Dette er svært viktig, vurderer at lokasjonsforespørsler har direkte effekt over enhetens batteriforbruk.

La oss nå implementere en LocationListener. Sjekk om brukeren ga programmet de riktige tillatelsene ved å opprette plassering Be om og vis dem den nåværende plasseringen på skjermen.

offentlig klasse MainActivity utvider AppCompatActivity implementerer // ... LocationListener private Location lastLocation; // ... // GoogleApiClient.ConnectionCallbacks connected @Override public void onConnected (@Nullable Bundle Bundle) Log.i (TAG, "onConnected ()"); getLastKnownLocation ();  // Få siste kjente plassering private void getLastKnownLocation () Log.d (TAG, "getLastKnownLocation ()"); if (checkPermission ()) lastLocation = LocationServices.FusedLocationApi.getLastLocation (googleApiClient); hvis (lastLocation! = null) Log.i (TAG, "LasKnown location." + "Long:" + lastLocation.getLongitude () + "| Lat:" + lastLocation.getLatitude ()); writeLastLocation (); startLocationUpdates ();  ellers Log.w (TAG, "Ingen plassering hentet ennå"); startLocationUpdates ();  else askPermission ();  Private LocationRequest locationRequest; // Definert i mili sekunder. // Dette nummeret er ekstremt lavt, og bør kun brukes til feilsøking, privat endelig int UPDATE_INTERVAL = 1000; privat endelig int FASTEST_INTERVAL = 900; // Startsted Oppdateringer privat tomt startLocationUpdates () Log.i (TAG, "startLocationUpdates ()"); locationRequest = LocationRequest.create () .setPriority (LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval (UPDATE_INTERVAL) .setFastestInterval (FASTEST_INTERVAL); if (checkPermission ()) LocationServices.FusedLocationApi.requestLocationUpdates (googleApiClient, locationRequest, dette);  @Override public void onLocationChanged (Plasseringssted) Log.d (TAG, "onLocationChanged [" + location + "]"); lastLocation = location; writeActualLocation (posisjon);  // Skriv plasseringskoordinater på brukergrensesnittet privat void writeActualLocation (plasseringssted) textLat.setText ("Lat:" + location.getLatitude ()); textLong.setText ("Long:" + location.getLongitude ());  privat tomt writeLastLocation () writeActualLocation (lastLocation);  // Sjekk om tillatelse til å få tilgang til Lokal privat boolsk kontrollmelding () Log.d (TAG, "checkPermission ()"); // Be om tillatelse dersom det ikke ble gitt ennå, returnere (ContextCompat.checkSelfPermission (dette, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);  // Be om tillatelse privat void askPermission () Log.d (TAG, "askPermission ()"); ActivityCompat.requestPermissions (dette, ny streng [] Manifest.permission.ACCESS_FINE_LOCATION, REQ_PERMISSION);  // Verifiser brukerens svar på tillatelsen som er forespurt @Override public void onRequestPermissionsResult (int requestCode, @NonNull String [] tillatelser, @NonNull int [] grantResults) Log.d (TAG, "onRequestPermissionsResult ()"); super.onRequestPermissionsResult (requestCode, permissions, grantResults); bytt (requestCode) tilfelle REQ_PERMISSION: if (grantResults.length> 0 && grantResults [0] == PackageManager.PERMISSION_GRANTED) // Tillatelse gitt getLastKnownLocation ();  else // Tillatelse nektet permissionsDenied ();  gå i stykker;  // App kan ikke fungere uten tillatelsene private void permissionsDenied () Log.w (TAG, "permissionsDenied ()"); 

Det er viktig å ta opp det LocationRequest Opprettet ovenfor er ikke optimalisert for et produksjonsmiljø. De UPDATE_INTERVAL er for kort og vil forbruke for mye batteristrøm. En mer realistisk konfigurasjon for produksjon kan være:

privat endelig int UPDATE_INTERVAL = 3 * 60 * 1000; // 3 minutter privat endelig int FASTEST_INTERVAL = 30 * 1000; // 30 sekunder privat tomt startLocationUpdates () Log.i (TAG, "startLocationUpdates ()"); locationRequest = LocationRequest.create () .setPriority (LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval (UPDATE_INTERVAL) .setFastestInterval (FASTEST_INTERVAL); if (checkPermission ()) LocationServices.FusedLocationApi.requestLocationUpdates (googleApiClient, locationRequest, dette); 

Trinn 7: GoogleMap Markers

Våre Aktivitet trenger to forskjellige markører. EN locationMarker bruker breddegrad og lengdegrad gitt av FusedLocationProviderApi for å informere enhetens nåværende posisjon. EN geoFenceMarker er målet for geofence-opprettelsen som den bruker den siste berøringen gitt på kartet for å hente sin posisjon.

@Override public void onMapClick (LatLng latLng) Log.d (TAG, "onMapClick (" + latLng + ")"); markerForGeofence (lengde- og breddegrad);  privat void writeActualLocation (plassering sted) // ... markørLocation (new LatLng (location.getLatitude (), location.getLongitude ()));  Private Marker LocationMarker; // Opprett en plasseringsmarkør privat tommarkeringsplassering (LatLng latLng) Log.i (TAG, "markerLocation (" + latLng + ")"); String title = latLng.latitude + "," + latLng.longitude; MarkerOptions markerOptions = new MarkerOptions () .position (latLng) .title (title); hvis (map! = null) // Fjern den fremre markøren hvis (locationMarker! = null) locationMarker.remove (); locationMarker = map.addMarker (markerOptions); flytezoom = 14f; CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom (latLng, zoom); map.animateCamera (cameraUpdate);  privatmarkør geoFenceMarker; // Opprett en markør for geofence opprettelsen privat tommarkeringForGeofence (LatLng latLng) Log.i (TAG, "markerForGeofence (" + latLng + ")"); String title = latLng.latitude + "," + latLng.longitude; // Definer markeringsalternativer MarkerOptions markerOptions = new MarkerOptions () .position (latLng) .icon (BitmapDescriptorFactory.defaultMarker (BitmapDescriptorFactory.HUE_ORANGE)) .title (title); hvis (map! = null) // Fjern siste geoFenceMarker hvis (geoFenceMarker! = null) geoFenceMarker.remove (); geoFenceMarker = map.addMarker (markerOptions); 

Trinn 8: Opprette en Geofence

Endelig er det på tide å lage en geofence. Vi bruker geoFenceMarker som midtpunkt for geofensen.

privat statisk endelig lang GEO_DURATION = 60 * 60 * 1000; privat statisk sluttstreng GEOFENCE_REQ_ID = "My Geofence"; privat statisk sluttflyt GEOFENCE_RADIUS = 500.0f; // i meter // Opprett en Geofence privat Geofence createGeofence (LatLng latLng, floatradius) Log.d (TAG, "createGeofence"); returnere ny Geofence.Builder () .setRequestId (GEOFENCE_REQ_ID) .setCircularRegion (latLng.latitude, latLng.length, radius) .setExpirationDuration (GEO_DURATION) .setTransitionTypes (Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .build (); 

Deretter lager vi GeofencingRequest gjenstand.

// Opprett en Geofence-forespørsel privat GeofencingRequest createGeofenceRequest (Geofence geofence) Log.d (TAG, "createGeofenceRequest"); returner ny GeofencingRequest.Builder () .setInitialTrigger (GeofencingRequest.INITIAL_TRIGGER_ENTER) .addGeofence (geofence) .build (); 

Vi bruker en PendingIntent motsette seg å ringe a IntentService som vil håndtere GeofenceEvent. Vi lager GeofenceTrasitionService.class seinere.

Privat PendingIntent GeoFencePendingIntent; privat endelig int GEOFENCE_REQ_CODE = 0; privat PendingIntent createGeofencePendingIntent () Log.d (TAG, "createGeofencePendingIntent"); hvis (geoFencePendingIntent! = null) returnerer geoFencePendingIntent; Intent Intent = Ny Intent (dette, GeofenceTrasitionService.class); returnere PendingIntent.getService (dette, GEOFENCE_REQ_CODE, hensikt, PendingIntent.FLAG_UPDATE_CURRENT);  // Legg til den opprettede GeofenceRequest til enhetens overvåkingsliste privat void addGeofence (GeofencingRequest request) Log.d (TAG, "addGeofence"); if (checkPermission ()) LocationServices.GeofencingApi.addGeofences (googleApiClient, request, createGeofencePendingIntent ()) .setResultCallback (dette); 

Vi tegner også geofensen på kartet som en visuell referanse.

@Override public void onResult (@NonNull Status status) Log.i (TAG, "onResult:" + status); hvis (status.isSuccess ()) drawGeofence ();  ellers // informer om mislykket // Tegn Geofence-sirkel på GoogleMap Private Circle geoFenceLimits; privat ugyldig drawGeofence () Log.d (TAG, "drawGeofence ()"); hvis (geoFenceLimits! = null) geoFenceLimits.remove (); CircleOptions circleOptions = new CircleOptions () .center (geoFenceMarker.getPosition ()) .strokeColor (Color.argb (50, 70,70,70)) .fillColor (Color.argb (100, 150, 150, 150)) .radio (GEOFENCE_RADIUS); geoFenceLimits = map.addCircle (circleOptions); 

De startGeofence () Metoden er ansvarlig for å starte geofencing prosessen i Hoved aktivitet klasse.

 @Override public boolean onOptionsItemSelected (MenuItem item) switch (item.getItemId ()) tilfelle R.id.geofence: startGeofence (); returnere sant;  returnere super.onOptionsItemSelected (item);  // Start Geofence opprettingsprosess private void startGeofence () Log.i (TAG, "startGeofence ()"); hvis (geoFenceMarker! = null) Geofence geofence = createGeofence (geoFenceMarker.getPosition (), GEOFENCE_RADIUS); GeofencingRequest geofenceRequest = createGeofenceRequest (geofence); addGeofence (geofenceRequest);  ellers Log.e (TAG, "Geofence markør er null"); 

Trinn 9: Geofence Transition Service

Vi kan nå endelig opprette GeofenceTrasitionService.class nevnt tidligere. Denne klassen strekker seg IntentService og er ansvarlig for å håndtere GeofencingEvent. Først får vi denne hendelsen fra mottatt hensikt.

GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent (hensikt);

Vi sjekker deretter om den typen geofencing-overgang som fant sted, er av interesse for oss. Hvis det er, henter vi en liste over utløst geofences og oppretter et varsel med de aktuelle handlingene.

// Hent GeofenceTrasition int geoFenceTransition = geofencingEvent.getGeofenceTransition (); // Sjekk om overgangstypen hvis (geoFenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER || geoFenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) // Få geofence som ble utløst Liste triggeringGeofences = geofencingEvent.getTriggeringGeofences (); // Opprett en detaljmelding med Geofences mottatt String geofenceTransitionDetails = getGeofenceTrasitionDetails (geoFenceTransition, triggeringGeofences); // Send varsel detaljer som en streng sendNotification (geofenceTransitionDetails); 

Jeg har også implementert noen få hjelpemetoder for å gjøre implementeringen av klassen lettere å forstå.

offentlig klasse GeofenceTrasitionService utvider IntentService private static final String TAG = GeofenceTrasitionService.class.getSimpleName (); offentlig statisk endelig int GEOFENCE_NOTIFICATION_ID = 0; offentlig GeofenceTrasitionService () super (TAG);  @Override protected void onHandleIntent (Intent Intent) // Hent Geofencing-hensikten GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent (hensikt); // Håndtering feil hvis (geofencingEvent.hasError ()) String errorMsg = getErrorString (geofencingEvent.getErrorCode ()); Log.e (TAG, errorMsg); komme tilbake;  // Hent GeofenceTrasition int geoFenceTransition = geofencingEvent.getGeofenceTransition (); // Sjekk om overgangstypen hvis (geoFenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER || geoFenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) // Få geofence som ble utløst Liste triggeringGeofences = geofencingEvent.getTriggeringGeofences (); // Opprett en detaljmelding med Geofences mottatt String geofenceTransitionDetails = getGeofenceTrasitionDetails (geoFenceTransition, triggeringGeofences); // Send varsel detaljer som en streng sendNotification (geofenceTransitionDetails);  // Opprett en detaljmelding med Geofences mottatt private String getGeofenceTrasitionDetails (int geoFenceTransition, List triggeringGeofences) // få ID for hver geofence utløst ArrayList triggeringGeofencesList = ny ArrayList <> (); for (Geofence geofence: triggeringGeofences) triggeringGeofencesList.add (geofence.getRequestId ());  String status = null; hvis (geoFenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER) status = "Entering"; ellers hvis (geoFenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) status = "Exiting"; returstatus + TextUtils.join (",", triggeringGeofencesList);  // Send et varsel privat void sendNotification (String msg) Log.i (TAG, "sendNotification:" + msg); // Intent å starte hovedaktiviteten Intent notificationIntent = MainActivity.makeNotificationIntent (getApplicationContext (), msg); TaskStackBuilder stackBuilder = TaskStackBuilder.create (dette); stackBuilder.addParentStack (MainActivity.class); stackBuilder.addNextIntent (notificationIntent); PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent (0, PendingIntent.FLAG_UPDATE_CURRENT); // Opprette og sende Notification NotificationManager notificatioMng = (NotificationManager) getSystemService (Context.NOTIFICATION_SERVICE); notifikatioMng.notify (GEOFENCE_NOTIFICATION_ID, createNotification (msg, notificationPendingIntent));  // Opprett et varsel privat Varsling createNotification (String msg, PendingIntent notificationPendingIntent) NotificationCompat.Builder notificationBuilder = ny NotificationCompat.Builder (dette); notificationBuilder .setSmallIcon (R.drawable.ic_action_location) .setColor (Color.RED) .setContentTitle (msg) .setContentText ("Geofence Notification!") .setContentIntent (notificationPendingIntent) .setDefaults (Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND ) .setAutoCancel (true); returnere meldingBuilder.build ();  // Håndter feil privat statisk String getErrorString (int errorCode) switch (errorCode) tilfelle GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE: returnere "GeoFence ikke tilgjengelig"; tilfelle GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES: returner "For mange GeoFences"; tilfelle GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS: returnere "For mange ventende hensikter"; standard: returnere "Ukjent feil."; 

3. Testing

Testing på en virtuell enhet

Det er mye enklere å teste geofencing på en virtuell enhet. Det er flere måter å gjøre dette på. I Android Studio, åpne en virtuell enhet og klikk på flere valgknappene nederst til høyre.

plassering fanen til venstre, skriv inn koordinatene for stedet.

Jeg foretrekker å bruke telnet kommandoer for å kontrollere den virtuelle enheten. For å bruke dette må du koble til enheten fra kommandolinjen ved å bruke følgende kommando:

telnet localhost [DEVICE_PORT]

Enhetsporten vises i vinduet for virtuell enhet. Enhetsporten er vanligvis lik 5554.

Det er mulig at du må autorisere denne tilkoblingen ved hjelp av din auth_token, men kommandolinjen viser deg hvor den befinner seg. Naviger til den plasseringen og kopier token og typen, auth [YOUR_AUTH_TOKEN].

Du kan nå angi plasseringen av enheten ved å kjøre følgende kommando:

geo fix [LATITUDE] [LONGITUDE]

Konklusjon

Geofencing kan være et flott tillegg til appen din, da det kan øke brukerengasjementet betydelig. Det er mange muligheter til å utforske, og du kan til og med skape en sofistikert opplevelse med innendørs beacons, for eksempel Estimote. Med innendørs beacons vet du nøyaktig hvor brukeren har passert, for eksempel et kjøpesenter.

Å legge Geofencing til et prosjekt er enkelt, men vi må alltid holde strømforbruket i tankene. Dette betyr at vi må nøye velge størrelsen på geofence og oppdateringshastigheten fordi både direkte påvirker strømforbruket av søknaden din.

Testing er derfor svært viktig for å få en realistisk oppfatning av strømforbruket i søknaden din. Vurder også å gi brukerne muligheten til å deaktivere geofencing helt hvis de ikke vil eller trenger denne funksjonen.