Учебники

Android — Службы на основе местоположения

API определения местоположения Android позволяют легко создавать приложения, учитывающие местоположение, без необходимости фокусироваться на деталях базовой технологии определения местоположения.

Это становится возможным с помощью сервисов Google Play , которые облегчают добавление информации о местоположении в ваше приложение с помощью автоматического отслеживания местоположения, геозон и распознавания активности.

Из этого туториала Вы узнаете, как использовать службы определения местоположения в вашем приложении для получения текущего местоположения, периодических обновлений местоположения, поиска адресов и т. Д.

Местоположение объекта

Объект Location представляет собой географическое местоположение, которое может состоять из широты, долготы, отметки времени и другой информации, такой как азимут, высота над уровнем моря и скорость. Существуют следующие важные методы, которые вы можете использовать с объектом Location для получения информации о местоположении —

Sr.No. Метод и описание
1

float distanceTo (Место назначения)

Возвращает приблизительное расстояние в метрах между этим местоположением и заданным местоположением.

2

float getAccuracy ()

Получите приблизительную точность этого местоположения в метрах.

3

double getAltitude ()

Получите высоту, если доступно, в метрах над уровнем моря.

4

float getBearing ()

Получить подшипник, в градусах.

5

double getLatitude ()

Получите широту, в градусах.

6

double getLongitude ()

Получите долготу в градусах.

7

float getSpeed ​​()

Получите скорость, если она доступна, в метрах / секунду над землей.

8

логическое hasAcraracy ()

Истинно, если это местоположение имеет точность.

9

логический hasAltitude ()

Верно, если это местоположение имеет высоту.

10

логическое значение hasBearing ()

Истинно, если у этого местоположения есть отношение.

11

логическое hasSpeed ​​()

Верно, если это местоположение имеет скорость.

12

сброс void ()

Очищает содержимое локации.

13

void setAccuracy (точность с плавающей точкой)

Установите расчетную точность этого местоположения, метров.

14

void setAltitude (двойная высота)

Установите высоту в метрах над уровнем моря.

15

void setBearing (поплавковый подшипник)

Установите подшипник в градусах.

16

void setLatitude (двойная широта)

Установите широту в градусах.

17

void setLongitude (двойная долгота)

Установите долготу в градусах.

18

void setSpeed ​​(скорость плавания)

Установите скорость в метрах / секунду над землей.

19

Строка toString ()

Возвращает строку, содержащую краткое, понятное человеку описание этого объекта.

float distanceTo (Место назначения)

Возвращает приблизительное расстояние в метрах между этим местоположением и заданным местоположением.

float getAccuracy ()

Получите приблизительную точность этого местоположения в метрах.

double getAltitude ()

Получите высоту, если доступно, в метрах над уровнем моря.

float getBearing ()

Получить подшипник, в градусах.

double getLatitude ()

Получите широту, в градусах.

double getLongitude ()

Получите долготу в градусах.

float getSpeed ​​()

Получите скорость, если она доступна, в метрах / секунду над землей.

логическое hasAcraracy ()

Истинно, если это местоположение имеет точность.

логический hasAltitude ()

Верно, если это местоположение имеет высоту.

логическое значение hasBearing ()

Истинно, если у этого местоположения есть отношение.

логическое hasSpeed ​​()

Верно, если это местоположение имеет скорость.

сброс void ()

Очищает содержимое локации.

void setAccuracy (точность с плавающей точкой)

Установите расчетную точность этого местоположения, метров.

void setAltitude (двойная высота)

Установите высоту в метрах над уровнем моря.

void setBearing (поплавковый подшипник)

Установите подшипник в градусах.

void setLatitude (двойная широта)

Установите широту в градусах.

void setLongitude (двойная долгота)

Установите долготу в градусах.

void setSpeed ​​(скорость плавания)

Установите скорость в метрах / секунду над землей.

Строка toString ()

Возвращает строку, содержащую краткое, понятное человеку описание этого объекта.

Получить текущее местоположение

Чтобы получить текущее местоположение, создайте клиент местоположения, который является объектом LocationClient , подключите его к Location Services с помощью метода connect () , а затем вызовите его метод getLastLocation () . Этот метод возвращает самое последнее местоположение в форме объекта Location, который содержит координаты широты и долготы и другую информацию, как описано выше. Чтобы иметь функциональность на основе определения местоположения в вашей деятельности, вам нужно будет реализовать два интерфейса:

  • GooglePlayServicesClient.ConnectionCallbacks
  • GooglePlayServicesClient.OnConnectionFailedListener

Эти интерфейсы предоставляют следующие важные методы обратного вызова, которые вам необходимо реализовать в своем классе деятельности —

Sr.No. Методы и описание обратного вызова
1

абстрактный void onConnected (Bundle connectionHint)

Этот метод обратного вызова вызывается, когда служба определения местоположения успешно подключена к клиенту определения местоположения. Вы будете использовать метод connect () для подключения к клиенту местоположения.

2

абстрактный void onDisconnected ()

Этот метод обратного вызова вызывается, когда клиент отключен. Вы будете использовать метод connect () для отключения от клиента местоположения.

3

абстрактный void onConnectionFailed (результат ConnectionResult)

Этот метод обратного вызова вызывается, когда произошла ошибка при подключении клиента к службе.

абстрактный void onConnected (Bundle connectionHint)

Этот метод обратного вызова вызывается, когда служба определения местоположения успешно подключена к клиенту определения местоположения. Вы будете использовать метод connect () для подключения к клиенту местоположения.

абстрактный void onDisconnected ()

Этот метод обратного вызова вызывается, когда клиент отключен. Вы будете использовать метод connect () для отключения от клиента местоположения.

абстрактный void onConnectionFailed (результат ConnectionResult)

Этот метод обратного вызова вызывается, когда произошла ошибка при подключении клиента к службе.

Вам следует создать клиент местоположения в методе onCreate () вашего класса активности, а затем подключить его в onStart () , чтобы службы определения местоположения поддерживали текущее местоположение, пока ваша активность полностью видна. Вы должны отключить клиент в методе onStop () , чтобы, когда ваше приложение не было видно, Location Services не поддерживал текущее местоположение. Это помогает в значительной степени сэкономить заряд батареи.

Получить обновленное местоположение

Если вы хотите получать обновления местоположения, то кроме вышеупомянутых интерфейсов вам также потребуется реализовать интерфейс LocationListener . Этот интерфейс обеспечивает следующий метод обратного вызова, который вам нужно реализовать в вашем классе деятельности —

Sr.No. Метод обратного вызова и описание
1

абстрактный void onLocationChanged (расположение)

Этот метод обратного вызова используется для получения уведомлений от LocationClient, когда местоположение изменилось.

абстрактный void onLocationChanged (расположение)

Этот метод обратного вызова используется для получения уведомлений от LocationClient, когда местоположение изменилось.

Расположение Качество обслуживания

Объект LocationRequest используется для запроса качества обслуживания (QoS) для обновлений местоположения у LocationClient . Существуют следующие полезные методы установки, которые вы можете использовать для обработки QoS. Доступны эквивалентные методы получения, которые вы можете проверить в официальной документации Android.

Sr.No. Метод и описание
1

setExpirationDuration (длинный миллис)

Установите длительность этого запроса в миллисекундах.

2

setExpirationTime (длинный миллис)

Установите время истечения запроса в миллисекундах с момента загрузки.

3

setFastestInterval (длинный миллис)

Явно задайте самый быстрый интервал для обновления местоположения в миллисекундах.

4

setInterval (длинный миллис)

Установите желаемый интервал для активных обновлений местоположения в миллисекундах.

5

setNumUpdates (int numUpdates)

Установите количество обновлений местоположения.

6

setPriority (int priority)

Установите приоритет запроса.

setExpirationDuration (длинный миллис)

Установите длительность этого запроса в миллисекундах.

setExpirationTime (длинный миллис)

Установите время истечения запроса в миллисекундах с момента загрузки.

setFastestInterval (длинный миллис)

Явно задайте самый быстрый интервал для обновления местоположения в миллисекундах.

setInterval (длинный миллис)

Установите желаемый интервал для активных обновлений местоположения в миллисекундах.

setNumUpdates (int numUpdates)

Установите количество обновлений местоположения.

setPriority (int priority)

Установите приоритет запроса.

Теперь, например, если вашему приложению требуется местоположение с высокой точностью, оно должно создать запрос местоположения, для которого setPriority (int) имеет значение PRIORITY_HIGH_ACCURACY, а setInterval (long) — 5 секунд. Вы также можете использовать больший интервал и / или другие приоритеты, такие как PRIORITY_LOW_POWER, для запроса точности уровня «города» или PRIORITY_BALANCED_POWER_ACCURACY для точности уровня «блока».

Действия должны строго рассмотреть удаление всех запросов местоположения при входе в фоновый режим (например, при onPause ()) или, по крайней мере, переключить запрос на больший интервал и более низкое качество для экономии энергопотребления.

Отображение адреса местоположения

Если у вас есть объект Location , вы можете использовать метод Geocoder.getFromLocation (), чтобы получить адрес для заданной широты и долготы. Этот метод является синхронным, и для его работы может потребоваться много времени, поэтому вам следует вызывать метод из метода doInBackground () класса AsyncTask .

AsyncTask должен быть разделен на подклассы для использования, и подкласс переопределит метод doInBackground (Params …) для выполнения задачи в фоновом режиме, а метод onPostExecute (Result) вызывается в потоке пользовательского интерфейса после завершения фонового вычисления и во время отобразить результат. В AyncTask есть еще один важный метод — execute (Params … params) , который выполняет задачу с указанными параметрами.

пример

Следующий пример показывает вам, как на практике использовать Location Services в вашем приложении, чтобы получить текущее местоположение и его эквивалентные адреса и т. Д.

Чтобы поэкспериментировать с этим примером, вам понадобится настоящее мобильное устройство с новейшей ОС Android, в противном случае вам придется бороться с эмулятором, который может не работать.

Создать приложение для Android

шаг Описание
1 Вы будете использовать IDE Android Studio для создания приложения Android и назовите его как Tutorialspoint в пакете com.example.tutorialspoint7.myapplication .
2 добавьте файл src / GPSTracker.java и добавьте необходимый код.
3 Измените файл src / MainActivity.java и добавьте необходимый код, как показано ниже, чтобы получить текущее местоположение и его эквивалентный адрес.
4 Измените XML-файл макета res / layout / activity_main.xml, чтобы добавить все компоненты графического интерфейса, которые включают три кнопки и два текстовых представления для отображения местоположения / адреса.
5 Измените файл res / values ​​/ strings.xml, чтобы определить необходимые постоянные значения
6 Измените AndroidManifest.xml, как показано ниже
7 Запустите приложение, чтобы запустить эмулятор Android, и проверьте результат изменений, внесенных в приложение.

Ниже приводится содержимое измененного основного файла активности 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();
            }

         }
      });
   }
}

Ниже приводится содержание измененного основного файла активности 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;
   }
}

Ниже будет содержание файла res / layout / activity_main.xml

<?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>

Ниже будет содержимое файла res / values ​​/ strings.xml для определения двух новых констант:

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

Ниже приводится содержимое по умолчанию для 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>

Давайте попробуем запустить ваше приложение Tutorialspoint . Я предполагаю, что вы подключили свое фактическое мобильное устройство Android к компьютеру. Чтобы запустить приложение из Android Studio, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». Eclipse Run Icon значок с панели инструментов. Перед запуском приложения установщик Android-студии отобразит следующее окно, чтобы выбрать вариант, в котором вы хотите запустить приложение Android.

Мобильное устройство Android

Теперь, чтобы увидеть местоположение, выберите Get Location Button, которая будет отображать информацию о местоположении следующим образом: