Android - usługi oparte na lokalizacji

Interfejsy API lokalizacji systemu Android ułatwiają tworzenie aplikacji obsługujących lokalizację bez konieczności koncentrowania się na szczegółach podstawowej technologii lokalizacji.

Staje się to możliwe dzięki pomocy Google Play services, co ułatwia dodawanie świadomości lokalizacji do aplikacji dzięki automatycznemu śledzeniu lokalizacji, geofencingowi i rozpoznawaniu aktywności.

Ten samouczek pokazuje, jak korzystać z usług lokalizacji w aplikacji, aby uzyskać bieżącą lokalizację, otrzymywać okresowe aktualizacje lokalizacji, wyszukiwać adresy itp.

Obiekt lokalizacji

Plik Locationobiekt reprezentuje położenie geograficzne, które może składać się z szerokości i długości geograficznej, znacznika czasu i innych informacji, takich jak namiar, wysokość i prędkość. Istnieją następujące ważne metody, których można użyć z obiektem Location, aby uzyskać informacje dotyczące lokalizacji -

Sr.No. Metoda i opis
1

float distanceTo(Location dest)

Zwraca przybliżoną odległość w metrach między tą lokalizacją a daną lokalizacją.

2

float getAccuracy()

Uzyskaj szacunkową dokładność tej lokalizacji w metrach.

3

double getAltitude()

Uzyskaj wysokość, jeśli jest dostępna, w metrach nad poziomem morza.

4

float getBearing()

Uzyskaj namiar w stopniach.

5

double getLatitude()

Uzyskaj szerokość geograficzną w stopniach.

6

double getLongitude()

Podaj długość geograficzną w stopniach.

7

float getSpeed()

Uzyskaj prędkość, jeśli jest dostępna, w metrach / sekundę nad ziemią.

8

boolean hasAccuracy()

Prawda, jeśli ta lokalizacja ma dokładność.

9

boolean hasAltitude()

Prawda, jeśli ta lokalizacja ma wysokość.

10

boolean hasBearing()

Prawda, jeśli ta lokalizacja ma znaczenie.

11

boolean hasSpeed()

Prawda, jeśli ta lokalizacja ma prędkość.

12

void reset()

Czyści zawartość lokalizacji.

13

void setAccuracy(float accuracy)

Ustaw szacowaną dokładność tej lokalizacji, metry.

14

void setAltitude(double altitude)

Ustaw wysokość w metrach nad poziomem morza.

15

void setBearing(float bearing)

Ustaw łożysko w stopniach.

16

void setLatitude(double latitude)

Ustaw szerokość geograficzną w stopniach.

17

void setLongitude(double longitude)

Ustaw długość geograficzną w stopniach.

18

void setSpeed(float speed)

Ustaw prędkość w metrach / sekundę nad ziemią.

19

String toString()

Zwraca ciąg zawierający zwięzły, czytelny dla człowieka opis tego obiektu.

Uzyskaj aktualną lokalizację

Aby uzyskać bieżącą lokalizację, utwórz klienta lokalizacji, którym jest LocationClient obiektu, połącz go z usługami lokalizacji za pomocą connect() metodę, a następnie wywołaj jej getLastLocation()metoda. Ta metoda zwraca ostatnią lokalizację w postaciLocationobiekt, który zawiera współrzędne długości i szerokości geograficznej oraz inne informacje, jak wyjaśniono powyżej. Aby mieć funkcjonalność opartą na lokalizacji w swojej działalności, będziesz musiał zaimplementować dwa interfejsy -

  • GooglePlayServicesClient.ConnectionCallbacks
  • GooglePlayServicesClient.OnConnectionFailedListener

Te interfejsy zapewniają następujące ważne metody wywołania zwrotnego, które należy zaimplementować w swojej klasie aktywności -

Sr.No. Metody oddzwaniania i opis
1

abstract void onConnected(Bundle connectionHint)

Ta metoda wywołania zwrotnego jest wywoływana, gdy usługa lokalizacji zostanie pomyślnie połączona z klientem lokalizacji. Będziesz używaćconnect() metoda łączenia się z klientem lokalizacji.

2

abstract void onDisconnected()

Ta metoda wywołania zwrotnego jest wywoływana, gdy klient jest rozłączony. Będziesz używaćdisconnect() metoda rozłączenia się z klientem lokalizacji.

3

abstract void onConnectionFailed(ConnectionResult result)

Ta metoda wywołania zwrotnego jest wywoływana, gdy wystąpił błąd podczas łączenia klienta z usługą.

Należy utworzyć klienta lokalizacji w onCreate() metodę swojej klasy aktywności, a następnie podłącz ją onStart(), aby usługi lokalizacyjne zachowywały bieżącą lokalizację, gdy Twoja aktywność jest w pełni widoczna. Powinieneś odłączyć klientaonStop()tak, że gdy Twoja aplikacja nie jest widoczna, usługi lokalizacyjne nie zachowują bieżącej lokalizacji. Pomaga to w dużym stopniu oszczędzać energię baterii.

Pobierz zaktualizowaną lokalizację

Jeśli chcesz mieć aktualizacje lokalizacji, to oprócz wyżej wymienionych interfejsów będziesz musiał zaimplementować LocationListenerinterfejs. Ten interfejs zapewnia następującą metodę wywołania zwrotnego, którą musisz zaimplementować w swojej klasie aktywności -

Sr.No. Sposób oddzwaniania i opis
1

abstract void onLocationChanged(Location location)

Ta metoda wywołania zwrotnego służy do odbierania powiadomień z LocationClient, gdy lokalizacja ulegnie zmianie.

Lokalizacja Jakość usług

Plik LocationRequest obiekt służy do żądania jakości usługi (QoS) dla aktualizacji lokalizacji z LocationClient. Istnieją następujące przydatne metody ustawiające, których można użyć do obsługi QoS. Dostępne są równoważne metody pobierania, które można sprawdzić w oficjalnej dokumentacji Androida.

Sr.No. Metoda i opis
1

setExpirationDuration(long millis)

Ustaw czas trwania tego żądania w milisekundach.

2

setExpirationTime(long millis)

Ustaw czas wygaśnięcia żądania w milisekundach od rozruchu.

3

setFastestInterval(long millis)

Jawnie ustaw najszybszy interwał aktualizacji lokalizacji w milisekundach.

4

setInterval(long millis)

Ustaw żądany interwał aktualizacji aktywnych lokalizacji w milisekundach.

5

setNumUpdates(int numUpdates)

Ustaw liczbę aktualizacji lokalizacji.

6

setPriority(int priority)

Ustaw priorytet żądania.

Na przykład, jeśli Twoja aplikacja wymaga lokalizacji o wysokiej dokładności, powinna utworzyć żądanie lokalizacji z rozszerzeniem setPriority(int) ustawione na PRIORITY_HIGH_ACCURACY i setInterval(long)do 5 sekund. Możesz również użyć większego interwału i / lub innych priorytetów, takich jak PRIORITY_LOW_POWER, aby zażądać dokładności na poziomie miasta lub PRIORITY_BALANCED_POWER_ACCURACY, aby uzyskać dokładność na poziomie „blokowym”.

Działania powinny zdecydowanie rozważyć usunięcie wszystkich żądań lokalizacji podczas wchodzenia w tło (na przykład onPause ()) lub przynajmniej zamienić żądanie na większy interwał i niższą jakość, aby zaoszczędzić zużycie energii.

Wyświetlanie adresu lokalizacji

Kiedy już masz Location obiekt, którego możesz użyć Geocoder.getFromLocation()metoda uzyskania adresu dla podanej szerokości i długości geograficznej. Ta metoda jest synchroniczna i może zająć dużo czasu, aby wykonać swoją pracę, dlatego należy wywołać metodę z plikudoInBackground() metoda AsyncTask klasa.

Plik AsyncTask musi być podklasa, aby była używana, a podklasa zostanie nadpisana doInBackground(Params...) metoda wykonywania zadania w tle i onPostExecute(Result)jest wywoływana w wątku interfejsu użytkownika po zakończeniu obliczeń w tle i w momencie wyświetlenia wyniku. Jest jeszcze jedna ważna metoda dostępna w AyncTask, czyliexecute(Params... params), ta metoda wykonuje zadanie z określonymi parametrami.

Przykład

Poniższy przykład pokazuje w praktyce, jak korzystać z usług lokalizacji w aplikacji, aby uzyskać bieżącą lokalizację, jej równoważne adresy itp.

Aby poeksperymentować z tym przykładem, będziesz potrzebować rzeczywistego urządzenia mobilnego wyposażonego w najnowszy system operacyjny Android, w przeciwnym razie będziesz musiał zmagać się z emulatorem, który może nie działać.

Utwórz aplikację na Androida

Krok Opis
1 Użyjesz Android Studio IDE do stworzenia aplikacji na Androida i nadaj jej nazwę Tutorialspoint w pakiecie com.example.tutorialspoint7.myapplication .
2 dodaj plik src / GPSTracker.java i dodaj wymagany kod.
3 Zmodyfikuj plik src / MainActivity.java i dodaj wymagany kod, jak pokazano poniżej, aby uzyskać bieżącą lokalizację i jej równoważny adres.
4 Zmodyfikuj plik XML układu res / layout / activity_main.xml, aby dodać wszystkie komponenty GUI, które obejmują trzy przyciski i dwa widoki tekstowe, aby pokazać lokalizację / adres.
5 Zmodyfikuj res / values ​​/ strings.xml, aby zdefiniować wymagane wartości stałe
6 Zmodyfikuj plik AndroidManifest.xml, jak pokazano poniżej
7 Uruchom aplikację, aby uruchomić emulator Androida i zweryfikować wynik zmian wprowadzonych w aplikacji.

Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania MainActivity.java.

package com.example.tutorialspoint7.myapplication;

import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.test.mock.MockPackageManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

   Button btnShowLocation;
   private static final int REQUEST_CODE_PERMISSION = 2;
   String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;

   // GPSTracker class
   GPSTracker gps;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
		
      try {
         if (ActivityCompat.checkSelfPermission(this, mPermission)
            != MockPackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, new String[]{mPermission}, 
               REQUEST_CODE_PERMISSION);

            // If any permission above not allowed by user, this condition will
               execute every time, else your else part will work
         }
      } catch (Exception e) {
         e.printStackTrace();
      }

      btnShowLocation = (Button) findViewById(R.id.button);

      // show location button click event
      btnShowLocation.setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View arg0) {
            // create class object
            gps = new GPSTracker(MainActivity.this);

            // check if GPS enabled
            if(gps.canGetLocation()){

               double latitude = gps.getLatitude();
               double longitude = gps.getLongitude();

               // \n is for new line
               Toast.makeText(getApplicationContext(), "Your Location is - \nLat: "
                  + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
            }else{
               // can't get location
               // GPS or Network is not enabled
               // Ask user to enable GPS/network in settings
               gps.showSettingsAlert();
            }

         }
      });
   }
}

Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania GPSTracker.java.

package com.example.tutorialspoint7.myapplication;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

   private final Context mContext;

   // flag for GPS status
   boolean isGPSEnabled = false;

   // flag for network status
   boolean isNetworkEnabled = false;

   // flag for GPS status
   boolean canGetLocation = false;

   Location location; // location
   double latitude; // latitude
   double longitude; // longitude

   // The minimum distance to change Updates in meters
   private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

   // The minimum time between updates in milliseconds
   private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

   // Declaring a Location Manager
   protected LocationManager locationManager;

   public GPSTracker(Context context) {
      this.mContext = context;
      getLocation();
   }

   public Location getLocation() {
      try {
         locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

         // getting GPS status
         isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

         // getting network status
         isNetworkEnabled = locationManager
            .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

         if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
         } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
               locationManager.requestLocationUpdates(
                  LocationManager.NETWORK_PROVIDER,
                  MIN_TIME_BW_UPDATES,
                  MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
						
               Log.d("Network", "Network");
               if (locationManager != null) {
                  location = locationManager
                     .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
							
                  if (location != null) {
                     latitude = location.getLatitude();
                     longitude = location.getLongitude();
                  }
               }
            }
				
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
               if (location == null) {
                  locationManager.requestLocationUpdates(
                     LocationManager.GPS_PROVIDER,
                     MIN_TIME_BW_UPDATES,
                     MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
							
                  Log.d("GPS Enabled", "GPS Enabled");
                  if (locationManager != null) {
                     location = locationManager
                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
								
                     if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                     }
                  }
               }
            }
         }

      } catch (Exception e) {
         e.printStackTrace();
      }

      return location;
   }

   /**
      * Stop using GPS listener
      * Calling this function will stop using GPS in your app
   * */
	
   public void stopUsingGPS(){
      if(locationManager != null){
         locationManager.removeUpdates(GPSTracker.this);
      }
   }

   /**
      * Function to get latitude
   * */
	
   public double getLatitude(){
      if(location != null){
         latitude = location.getLatitude();
      }

      // return latitude
      return latitude;
   }

   /**
      * Function to get longitude
   * */
	
   public double getLongitude(){
      if(location != null){
         longitude = location.getLongitude();
      }

      // return longitude
      return longitude;
   }

   /**
      * Function to check GPS/wifi enabled
      * @return boolean
   * */
	
   public boolean canGetLocation() {
      return this.canGetLocation;
   }

   /**
      * Function to show settings alert dialog
      * On pressing Settings button will lauch Settings Options
   * */
	
   public void showSettingsAlert(){
      AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

      // Setting Dialog Title
      alertDialog.setTitle("GPS is settings");

      // Setting Dialog Message
      alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

      // On pressing Settings button
      alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog,int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
         }
      });

      // on pressing cancel button
      alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
         }
      });

      // Showing Alert Message
      alertDialog.show();
   }

   @Override
   public void onLocationChanged(Location location) {
   }

   @Override
   public void onProviderDisabled(String provider) {
   }

   @Override
   public void onProviderEnabled(String provider) {
   }

   @Override
   public void onStatusChanged(String provider, int status, Bundle extras) {
   }

   @Override
   public IBinder onBind(Intent arg0) {
      return null;
   }
}

Poniżej będzie treść res/layout/activity_main.xml plik -

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   android:layout_width = "fill_parent"
   android:layout_height = "fill_parent"
   android:orientation = "vertical" >


   <Button
      android:id = "@+id/button"
      android:layout_width = "fill_parent"
      android:layout_height = "wrap_content"
      android:text = "getlocation"/>

</LinearLayout>

Poniżej będzie treść res/values/strings.xml zdefiniować dwie nowe stałe -

<?xml version = "1.0" encoding = "utf-8"?>
<resources>
   <string name = "app_name">Tutorialspoint</string>
</resources>

Poniżej znajduje się domyślna zawartość AndroidManifest.xml -

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
   package = "com.example.tutorialspoint7.myapplication">
   <uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
   <uses-permission android:name = "android.permission.INTERNET" />
   <application
      android:allowBackup = "true"
      android:icon = "@mipmap/ic_launcher"
      android:label = "@string/app_name"
      android:supportsRtl = "true"
      android:theme = "@style/AppTheme">
		
      <activity android:name = ".MainActivity">
         <intent-filter>
            <action android:name = "android.intent.action.MAIN" />

            <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>

</manifest>

Spróbujmy uruchomić Twój Tutorialspointpodanie. Zakładam, że podłączyłeś swoje rzeczywiste urządzenie mobilne z systemem Android do komputera. Aby uruchomić aplikację z Android Studio, otwórz jeden z plików aktywności projektu i kliknij

ikonę Uruchom na pasku narzędzi. Przed uruchomieniem aplikacji instalator Android Studio wyświetli następujące okno, aby wybrać opcję, w której chcesz uruchomić aplikację Android.

Teraz, aby zobaczyć lokalizację, wybierz przycisk Pobierz lokalizację, który wyświetli informacje o lokalizacji w następujący sposób -