Kasutaja asukoha teadmine on siin kasulik teave palju rakendusi arendame ja kasutame täna. Seal on palju populaarseid asukohapõhiseid rakendusi, mis muudavad meie elu lihtsamaks ja muudavad ka nende teenuste kasutamist. Näitena võib tuua meeletult populaarse rakenduse Foursquare, kus kasutajad, kes külastavad mõnda asukohta ja registreerivad end sisse, saavad sageli allahindlusi. Uber, mis aitab teil mobiiltelefonilt sõita madalama kiirusega kui tavaline takso. Nimekiri on suur ja kasvab endiselt.
veebi ja rakenduste keerulisi viise
Selles artiklis koostame Androidi Google'i asukohateenuste API abil kasutaja laiuse ja pikkuse määramiseks lihtsa Androidi rakenduse. Millal arendades Androidi rakendusi , on kasutaja asukoha saamiseks paar võimalust.
The pakett „android.location” on olnud saadaval alates Androidi esmakordsest kasutuselevõtust ja see annab meile juurdepääsu asukohateenustele. Need teenused võimaldavad rakendustel perioodiliselt värskendada seadme geograafilist asukohta.
Pakett pakub kahte võimalust asukohaandmete hankimiseks:
LocationManager.GPS_PROVIDER: määrab asukoha satelliitide abil. Sõltuvalt tingimustest võib sellel teenusepakkujal asukohaparanduse tagastamine aega võtta.
LocationManager.NETWORK_PROVIDER: määrab asukoha lähedal asuvate kärjetornide ja WiFi-pöörduspunktide kättesaadavuse põhjal. See on kiirem kui GPS_PROVIDER.
Kui otsite kasutaja asukohta, peate mängima nende pakkujatega ja nende saadavusega. Ideaalis hankiksite esimese asukoha, kasutades NETWORK_PROVIDER, mis ei pruugi olla nii täpne, kuid on palju kiirem. Seejärel võite proovida täpsust suurendada, kuulates GPS_PROVIDER abil paremat asukohaparandust.
Selle paketi pakutavad API-d on üsna madala tasemega ja nõuavad, et rakenduse arendaja tegeleks täpsemate üksikasjadega, et määrata, millal asukohateavet taotleda, ja optimeerida API-le helistamist. Arendaja kogemuste parandamiseks asukohapõhiste süsteemiteenuste kasutamisel ja asukohateadlike rakenduste väljatöötamise hõlbustamiseks tutvustas Google uut viisi kasutaja asukoha küsimiseks Google Play teenuste abil. See pakub lihtsamat, suurema täpsusega API-d, väikese energiatarbega geotara ja palju muud.
Google'i asukohateenuste API, tuntud ka kui FusedLocationProviderApi, on Google'i soovitatud viis kasutaja asukoha tuvastamiseks. See tagab parima täpsuse, lähtudes meie vajadustest. Mõned selle API kasutamise eelised eelmise ees on järgmised:
Lihtsus: erinevalt eelmisest API-st ei pea te enam tegelema mitme pakkujaga. Selle asemel määrate kõrgetasemelised vajadused, näiteks „kõrge täpsus” või „väike võimsus”, ja see võtab sobiva lähenemisviisi.
millist järgmistest peetakse tavaliseks turvaprobleemiks? (valige kõik sobivad.)
Kättesaadavus: annab teie rakendusele viivitamatu juurdepääsu parimasse ja viimasesse teadaolevasse asukohta. Tavaliselt on see teave hõlpsasti kättesaadav, peate lihtsalt seda küsima.
Energiatõhusus: minimeerib teie rakenduse energiatarbimist.
Mitmekülgsus: vastab paljudele vajadustele, alates esiplaani kasutamisest - vajavad ülitäpset asukohateavet kuni taustkasutuseni - vajavad ainult perioodilisi asukoha värskendusi, millel on tühine mõju elektrile.
Ehitame selle API abil asukohapõhise Androidi rakenduse. Selleks kasutame Androidi rakenduste arendamiseks Google'i soovitatud IDE-d - Android Studio . Android Studio'iga alustamine on üsna lihtne. Nende veebisait kirjeldab üksikasjalikult Android Studio installimise ja konfigureerimise protseduuri, sealhulgas seda, kuidas oma esimest Androidi rakendust arendamiseks käivitada.
Android Studio peaks meie jaoks asjad ülilihtsaks tegema. Kõigepealt peame konfigureerima koostamise skripti ja lisama selle rakenduse sõltuvuseks Google Play teenused. Seda saab teha faili build.gradle muutmisega järgmiselt:
dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' // Add this line }
Selle artikli kirjutamise ajal on Google Play teenuste uusim versioon saadaval 6.5.87. Enne alustamist veenduge, et kontrolliksite alati uusimat saadaval olevat versiooni. Juhul kui uuemad versioonid tulevad hiljem välja ja otsustate seda oma projektide jaoks värskendada, testige kõiki asukohaga seotud funktsioone kõigi teie toetatud Androidi versioonidega.
Siinkohal peaksime saama hakata oma rakenduse jaoks tegelikku tööd tegema.
Androididel on spetsiifilised turvafunktsioonid, mis takistaksid suvalist rakendust kasutaja täpset asukohta küsimast. Selle lahendamiseks peame muutma faili „AndroidManifest.xml” ja lisama me vajame luba selle rakenduse jaoks:
looge oma ethereumi märk
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; }
Sellel hetkel peaksime määratlema ka selle rakenduse jaoks kasutatava Google Play teenuste versiooni:
@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(); } } }
Enne Google Play teenuste pakutavate funktsioonide kasutamist peame kontrollima, kas seadmesse on installitud Google Play teenused ja kas see versioon on see, mida kavatseme kasutada (6.5.87).
protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); }
See meetod kontrollib Google Play teenuseid ja kui seade pole seda installinud (see on haruldane, kuid olen selliseid juhtumeid näinud), avab see vastava tõrega dialoogi ja kutsub kasutajat installima / värskendama Google Play teenused Google Play poest.
Kui kasutaja on rakenduse „GooglePlayServicesUtil.getErrorDialog ()” pakutava lahenduse lõpule viinud, käivitatakse tagasihelistamismeetod „onActivityResult ()”, nii et selle kõne käsitlemiseks peame rakendama mõnda loogikat:
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'i API-de juurde pääsemiseks peame tegema veel ühe sammu: looma GoogleApiClienti eksemplari. Google API klient pakub kõigile Google Play teenustele ühist sisenemispunkti ning haldab kasutaja seadme ja iga Google'i teenuse vahelist võrguühendust. Meie esimene samm on ühenduse loomine. Ma kutsun seda koodi tavaliselt tegevuse onCreate meetodist:
@Override protected void onStart() { super.onStart(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } }
Aheldades rea meetodikõnesid, täpsustame tagasihelistamisliidese juurutamist ja asukohateenuse API-d, mida soovime kasutada. Kui ühenduse loomine Google Play teenustega õnnestub, ebaõnnestub või peatatakse, saab liidese juurutamine, antud juhul „see“, vastuse asünkroonsele „connect ()“ meetodile. Pärast selle koodi lisamist peaks meie põhitegevus välja nägema järgmine:
@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(); } }
Seejärel kutsume oma onStart-meetodis meetodit 'connect' ja ootame, kuni käivitatakse tagasihelistusmeetod 'onConnected':
protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(20000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); }
'OnConnected' meetod näeb välja selline:
protected void startLocationUpdates() { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); }
See tagasihelistamine käivitatakse, kui Google Play teenused on ühendatud, mis tähendab, et selleks ajaks peaks meil olema viimane teadaolev asukoht. See asukoht võib olla aga null (see on haruldane, kuid mitte võimatu). Sel juhul soovitan kuulata asukohauuendusi, mida käsitletakse järgmisena.
Pärast rakenduse „getLastLocation” käivitamist võite soovida sulatatud asukoha pakkujalt perioodilisi värskendusi. Sõltuvalt teie rakendusest võib see periood olla lühike või pikk. Näiteks kui ehitate rakendust, mis jälgib kasutaja asukohta tema sõidu ajal, peate kuulama värskendusi lühikeste intervallidega. Teisest küljest, kui teie rakendus käsitleb kasutaja asukoha jagamist tema sõbraga, peate võib-olla lihtsalt mõnda aega seda asukohta taotlema.
Taotluse loomine on üsna lihtne - seda meetodit saate kutsuda meetodi „onCreate” sees:
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 instantsime uue LocationRequest objekt. Valige intervall 20 sekundiks (20000 millisekundit). Lisaks määrasime värskendatud kiiruse kiiruseks 5 sekundit. See käsib API-l pakkuda värskendusi iga 20 sekundi järel (soovitavalt), kuid kui 5 sekundi jooksul on mõni muudatus saadaval, peaks see ka selle ette nägema. Lõpuks seadsime prioriteediks PRIORITY_HIGH_ACCURACY ”Muude prioriteetsete valikute hulgas: PRIORITY_BALANCED_POWER_ACCURACY , PRIORITY_LOW_POWER , PRIORITY_NO_POWER .
Kui olete päringu koostanud, olete valmis asupaikade värskendusi kuulama pärast meetodi „onConnected ()” käivitamist.
protected void stopLocationUpdates() { if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this); } }
Nüüd jääb järele vaid tagasihelistamismeetodi rakendamine LocationListener liides:
js teisendab ajatempli kuupäevaks
@Override protected void onStop() { super.onStop(); if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } }
Oluline on otseselt värskenduste kuulamine lõpetada, kui te neid enam ei vaja või kui kasutaja lahkub teie rakendusest. OnPause'i tagasihelistamisel tuleb kasutada järgmist meetodit:
|_+_|
... ja Google API lahtiühendamine:
Nagu näete, on Androidis asukohateadlike rakenduste juurutamise põhiideed väga lihtsad. Veelgi enam, olemasolevate API-de abil, mis on nii lihtsasti kasutatavad kui ka hõlpsasti mõistetavad, ei tohiks Androidi jaoks põhiliste asukohapõhiste rakenduste loomine olla mõttetu. Väike näidisrakendus, mille oleme siin ehitanud, on mõeldud täpselt seda näitama. Leiate täieliku selle lähtekood GitHubis . Pange tähele, et asjade lihtsuse huvides ei tegele rakendus tagasihelistusmeetodiga „onConnectionFailed”.
Loodetavasti aitab see õpetus teil Google'i asukohateenuste API kasutamist alustada.