Käyttäjän sijainnin tunteminen on hyödyllistä monia sovelluksia kehitämme ja käytämme tänään. Siellä on paljon suosittuja sijaintiin perustuvia sovelluksia, jotka helpottavat elämäämme ja muuttavat tapaa, jolla käytämme näitä palveluja. Esimerkiksi on erittäin suosittu Foursquare -sovellus, jossa käyttäjät, jotka käyvät usein laitoksella ja 'kirjautuvat sisään', voittavat usein alennuksia. Uber, joka auttaa sinua saamaan matkan matkapuhelimestasi pienemmällä nopeudella kuin normaali taksi. Luettelo on suuri ja kasvaa edelleen.
Tässä artikkelissa aiomme rakentaa yksinkertaisen Android-sovelluksen, jolla määritetään käyttäjän leveys- ja pituusaste Androidin Google Location Services -sovellusliittymän avulla. Kun kehittää Android-sovelluksia , on olemassa muutama tapa saada käyttäjän sijainti.
paketti “android.location” on ollut käytettävissä Androidin ensimmäisestä käyttöönotosta lähtien, ja se antaa meille pääsyn sijaintipalveluihin. Näiden palvelujen avulla sovellukset voivat saada säännöllisiä päivityksiä laitteen maantieteellisestä sijainnista.
Paketti tarjoaa kaksi tapaa hankkia sijaintitiedot:
LocationManager.GPS_PROVIDER: Määrittää sijainnin satelliittien avulla. Ehdoista riippuen tällä palveluntarjoajalla voi kestää jonkin aikaa palauttaa sijaintikorjaus.
LocationManager.NETWORK_PROVIDER: Määrittää sijainnin läheisten solutornien ja WiFi-tukiasemien saatavuuden perusteella. Tämä on nopeampi kuin GPS_PROVIDER.
Kun etsit käyttäjän sijaintia, sinun on pelattava näiden palveluntarjoajien kanssa ja niiden saatavuudesta. Ihannetapauksessa hankit ensimmäisen sijainnin käyttämällä NETWORK_PROVIDER -ohjelmaa, joka ei ehkä ole yhtä tarkka, mutta on paljon nopeampi. Sitten voit yrittää lisätä tarkkuutta kuuntelemalla parempaa sijainnin korjausta GPS_PROVIDER: n avulla.
Tämän paketin tarjoamat sovellusliittymät ovat melko matalatasoisia, ja ne vaativat sovelluksen kehittäjää käsittelemään tarkemmat yksityiskohdat sen määrittämiseksi, milloin sijaintitietoja pyydetään, ja ajastamaan puhelut API: lle optimoidulla tavalla. Parantaakseen kehittäjäkokemusta sijaintipohjaisista järjestelmäpalveluista ja helpottaakseen sijaintitietoisten sovellusten kehittämisprosessia Google esitteli uuden tavan pyytää käyttäjän sijaintia Google Play -palveluiden avulla. Se tarjoaa yksinkertaisemman API: n, jolla on parempi tarkkuus, pienitehoinen geofencing ja paljon muuta.
Google Location Services -sovellusliittymä, joka tunnetaan myös nimellä FusedLocationProviderApi, on Googlen suosittelema tapa saada käyttäjän sijainti. Se tarjoaa parhaan tarkkuuden tarpeisiimme perustuen. Joitakin tämän API: n käytön etuja edelliseen verrattuna ovat:
Yksinkertaisuus: Toisin kuin edellinen sovellusliittymä, sinun ei enää tarvitse olla tekemisissä useiden palveluntarjoajien kanssa. Sen sijaan määrität korkean tason tarpeet, kuten 'korkea tarkkuus' tai 'pieni teho', ja se käyttää sopivaa lähestymistapaa.
Saatavuus: Antaa sovelluksellesi välittömän pääsyn parhaaseen ja viimeisimpään tunnettuun sijaintiin. Yleensä nämä tiedot ovat helposti saatavilla, sinun tarvitsee vain pyytää niitä.
Tehokkuus: Minimoi sovelluksesi virrankulutuksen.
Monipuolisuus: Täyttää monenlaiset tarpeet etualan käytöstä - erittäin tarkan sijaintitiedon tarvitsemisesta taustakäyttöön - joka vaatii vain säännöllisiä sijaintipäivityksiä, joilla on vähäinen teho.
Rakennetaanpaikkapohjainen Android-sovellus tämän API: n avulla. Tätä varten käytämme Googlen ehdottamaa IDE: tä Android-sovelluskehitykseen - Android Studio . Android Studion käytön aloittaminen on melko suoraviivaista. Heidän verkkosivustossaan kuvataan yksityiskohtaisesti menettely, johon sisältyy Android Studion asennus ja määritys, mukaan lukien ensimmäisen Android-sovelluksen uudelleenkäynnistys kehitystä varten.
Android Studion pitäisi tehdä asioista meille erittäin helppoja. Meidän on kuitenkin aloitettava määrittämällä koontikomentosarja ja lisäämällä Google Play -palvelut tämän sovelluksen riippuvuudeksi. Tämä voidaan tehdä muokkaamalla “build.gradle” -tiedostoa seuraavasti:
dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' // Add this line }
Kun kirjoitan tätä artikkelia, uusin käytettävissä oleva Google Play -palveluiden versio on 6.5.87. Varmista, että tarkistat aina uusimman saatavilla olevan version ennen aloittamista. Jos uudempia versioita ilmestyy myöhemmin tiellä ja päätät päivittää sen omille projekteillesi, testaa kaikki sijaintiin liittyvät ominaisuudet kaikissa tuetuissa Android-versioissa.
Tässä vaiheessa meidän pitäisi pystyä aloittamaan todellinen työ sovelluksellemme.
Androidilla on erityiset turvaominaisuudet, jotka estävät mielivaltaisia sovelluksia pyytämästä tarkkaa käyttäjän sijaintia. Tämän ratkaisemiseksi meidän on muokattava tiedostoa AndroidManifest.xml ja lisättävä tarvitsemme luvan tälle sovellukselle:
private boolean checkGooglePlayServices(){ int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(mContext); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * Google Play Services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, mContext, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; }
Meidän on määriteltävä myös Google Play -palvelujen versio, jota käytämme tässä sovelluksessa:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(mContext, 'Google Play Services must be installed.', Toast.LENGTH_SHORT).show(); finish(); } } }
Ennen kuin pääset käyttämään Google Play -palvelujen tarjoamia ominaisuuksia, meidän on tarkistettava, onko laitteeseen asennettu Google Play -palvelut ja että versio on se, jota aiomme käyttää (6.5.87).
protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); }
Tämä menetelmä tarkistaa Google Play -palvelut, ja jos laitetta ei ole asennettu (se on harvinaista, mutta olen nähnyt sellaisia tapauksia), se avaa vastaavan virheen sisältävän valintaikkunan ja kehottaa käyttäjää asentamaan / päivittämään Google Play -palvelut Google Play Kaupasta.
Kun käyttäjä on suorittanut GooglePlayServicesUtil.getErrorDialog () -palvelun tarjoaman tarkkuuden, takaisinsoittomenetelmä “onActivityResult ()” käynnistetään, joten meidän on käytettävä jonkin verran logiikkaa tämän puhelun käsittelemiseksi:
package com.bitwoo.userlocation; import android.content.Intent; import android.location.Location; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationServices; public class MainActivity extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static int REQUEST_CODE_RECOVER_PLAY_SERVICES = 200; private GoogleApiClient mGoogleApiClient; private Location mLastLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (checkGooglePlayServices()) { buildGoogleApiClient(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private boolean checkGooglePlayServices() { int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(this); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * google play services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, this, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(this, 'Google Play Services must be installed.', Toast.LENGTH_SHORT).show(); finish(); } } } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } @Override public void onConnected(Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(ConnectionResult connectionResult) { } }
Google-sovellusliittymien käyttämiseksi meidän on vain suoritettava vielä yksi vaihe: luotava GoogleApiClient-ilmentymä. Google-sovellusliittymäohjelma tarjoaa yhteisen lähtökohdan kaikkiin Google Play -palveluihin ja hallinnoi käyttäjän laitteen ja kunkin Google-palvelun välistä verkkoyhteyttä. Ensimmäinen askelemme on aloittaa yhteys. Kutsun tätä koodia yleensä toiminnan onCreate-menetelmästä:
@Override protected void onStart() { super.onStart(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } }
Ketjuamalla sarja menetelmäpuheluja määrittelemme takaisinsoittorajapinnan toteutuksen ja Location Service API: n, jota haluamme käyttää. Käyttöliittymän toteutus, tässä tapauksessa 'tämä', saa vastauksen asynkroniseen 'connect ()' -menetelmään, kun yhteys Google Play -palveluihin onnistuu, epäonnistuu tai jäädytetään. Kun olet lisännyt tämän koodin, MainActivity-palvelumme pitäisi näyttää tältä:
@Override public void onConnected(Bundle bundle) { mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation != null) { Toast.makeText(this, 'Latitude:' + mLastLocation.getLatitude()+', Longitude:'+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } }
Sitten 'onStart' -menetelmässämme kutsutaan 'connect' -menetelmää ja odotamme, että 'onConnected' -soittomenetelmää kutsutaan:
protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(20000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); }
OnConnected-menetelmä näyttää tältä:
protected void startLocationUpdates() { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); }
Tämä soittopyyntö käynnistyy, kun Google Play -palvelut on yhdistetty, mikä tarkoittaa, että siihen mennessä meillä pitäisi olla viimeinen tunnettu sijainti. Tämä sijainti voi kuitenkin olla tyhjä (se on harvinaista, mutta ei mahdotonta). Siinä tapauksessa suosittelen kuuntelemaan seuraavaksi käsiteltäviä sijaintipäivityksiä.
Kun olet kutsunut “getLastLocation”, saatat haluta pyytää säännöllisiä päivityksiä Fused Location Providerilta. Hakemuksestasi riippuen tämä jakso voi olla lyhyt tai pitkä. Jos esimerkiksi rakennat sovellusta, joka seuraa käyttäjän sijaintia hänen ajaessaan, sinun on kuunneltava päivityksiä lyhyin väliajoin. Toisaalta, jos sovelluksessasi on kyse käyttäjän sijainnin jakamisesta hänen ystävänsä kanssa, joudut ehkä vain pyytämään sijaintia silloin tällöin.
Pyynnön luominen on melko helppoa - voit kutsua tätä menetelmää “onCreate” -menetelmän sisällä:
public class MainActivity extends ActionBarActivity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { // ... @Override public void onLocationChanged(Location location) { mLastLocation = location; Toast.makeText(this, 'Latitude:' + mLastLocation.getLatitude()+', Longitude:'+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } }
Me välitämme uuden LocationRequest esine. Aseta aikaväliksi 20 sekuntia (20000 millisekuntia). Lisäksi asetimme kuristetun päivitysnopeuden 5 sekuntiin. Tämä käskee sovellusliittymää toimittamaan päivityksiä 20 sekunnin välein (mieluiten), mutta jos muutosta on saatavana 5 sekunnin kuluessa, myös sen tulisi antaa. Lopuksi asetamme prioriteetiksi PRIORITY_HIGH_ACCURACY ”, Muiden käytettävissä olevien prioriteettivaihtoehtojen joukossa: PRIORITY_BALANCED_POWER_ACCURACY , PRIORITY_LOW_POWER , PRIORITY_NO_POWER .
Kun olet rakentanut pyynnön, olet valmis aloittamaan sijaintipäivitysten kuuntelun, kun ”onConnected ()” -menetelmä on käynnistetty:
protected void stopLocationUpdates() { if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this); } }
Ainoa mitä on jäljellä, on toteuttaa takaisinsoittomenetelmä LocationListener käyttöliittymä:
@Override protected void onStop() { super.onStop(); if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } }
On tärkeää lopettaa nimenomaisesti päivitysten kuuntelu, kun et enää tarvitse niitä tai jos käyttäjä poistuu sovelluksestasi. Seuraava menetelmä tulisi kutsua onPause-soittopyynnön sisältä:
|_+_|
… Ja Google-sovellusliittymän irrottaminen:
Kuten näette, sijaintitietoisten sovellusten käyttöönoton taustalla olevat perusajatukset Androidissa ovat hyvin yksinkertaisia. Lisäksi käytettävissä olevien sovellusliittymien avulla, jotka ovat sekä helppokäyttöisiä että helposti ymmärrettäviä, sijaintipohjaisten perussovellusten rakentaminen Androidille ei ole helppoa. Täällä rakentamamme pieni näytesovellus on tarkoitettu osoittamaan juuri sitä. Löydät täydellisen tämän lähdekoodi GitHubissa . Huomaa, että asioiden yksinkertaistamiseksi sovellus ei käsittele ”onConnectionFailed” -soittomenetelmää.
Toivottavasti tämä opetusohjelma auttaa sinua aloittamaan Google Location Services -sovellusliittymän käytön.