Ответ 1
Я использовал API-интерфейс провайдера плавного доступа для получения периодических обновлений местоположения. Я реализовал его в фоновом режиме (например, LocationUpdateService extends Service
). Раньше я использовал API-интерфейсы платформы Android, но это не хорошо для использования в батареях. API-интерфейсы Fused Location Provider являются лучшими для эффективного использования батареи.
Я также подготовил примечания о шагах, которые необходимы для его реализации (наряду с другой полезной информацией). Говоря простыми словами, это лучший способ получить данные о местоположении на платформе Android на данный момент. Службы Google Play предоставляют много локальных API-интерфейсов для получения данных о местоположении (например, текущее местоположение пользователей, или вы можете сказать, что последнее известное местоположение устройств).
Поставщик Fused Location Provider является одним из локальных API в сервисах Google Play. Это предпосылки:
-
SDK Google Play используется как проект библиотеки (а также Google PlayService правильно установлен на вашем устройстве).
- Загрузите и установите компонент Службы Google Play из диспетчера SDK и добавьте библиотеку в свой проект.
- Импортируйте библиотеку
GooglePlayServices
из androidgoogle-play-services_lib
в проект разработки как проект библиотеки.
-
У вас должно быть реальное устройство, так как этот API не будет работать в эмуляторе.
Поставщик Fused Location Intelligent управляет технологией базового местоположения (подключение GPS/Wi-Fi/Network providers) и дает нам лучшее место в соответствии с нашими потребностями.
Зачем использовать его
Мы могли бы выбрать одного из поставщиков местоположения (сеть или GPS) и запросить обновления местоположения или настроить оповещение о близости. Но с этим подходом были две основные проблемы: 1. Если нам нужно определить точное местоположение, нам пришлось переключаться между сетью и провайдерами местоположения GPS (поскольку GPS не работает в помещении). 2. Предупреждения о близости были использованы для уведомления пользователя о близости к местоположению, и это сказалось на сроке службы батареи.
Преимущества
- Простые API: он позволяет нам задавать требования высокого уровня, такие как "высокая точность" или "низкая мощность", вместо того, чтобы беспокоиться о провайдерах местоположения.
- Аккумулятор эффективен: он минимизирует потребление энергии приложения. Основываясь на всех поступающих запросах местоположения и доступных датчиках, поставщик плавленного местоположения выбирает наиболее эффективный способ удовлетворения этих потребностей.
Шаги по использованию этого API:
-
Объявите разрешение на размещение в файле манифеста.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
или
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-
Внедрить связанные интерфейсы и обратные вызовы. Прежде чем запрашивать обновления местоположения, мы должны сначала реализовать интерфейсы, которые службы служб местоположения используют для связи статуса соединения с нашим приложением:
-
com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks
: указывает методы, которые службы служб местоположения вызывают при подключении или отключении клиента местоположения. -
com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener
-
-
Подключитесь к сервисам Google Play, подключив
LocationClient
к API Google. Для этого создайте объектLocationClient
(экземплярGoogleApiClient
) как:mLocationClient = new GoogleApiClient.Builder(getApplicationContext()) .addApi(LocationServices.API).addConnectionCallbacks(this) .addOnConnectionFailedListener(this).build();
И затем вызовите
mLocationClient.connect();
. -
Создайте экземпляр
FusedLocationProviderApi
с помощью классаLocationServices
следующим образом:private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
-
Получить текущее местоположение внутри
onConnected(Bundle bundle)
:Location currentLocation = fusedLocationProviderApi .getLastLocation(mLocationClient); if (mCurrentLocation != null) { Log.d(TAG, "last location = " + mCurrentLocation.getLatitude() + " - " + mCurrentLocation.getLongitude()); }
-
Создайте и настройте объект
LocationRequest
:mLocationRequest = new LocationRequest(); private void setLocationParameter() { // Set the update interval mLocationRequest.setInterval(Constants.SECONDS_TO_UP); // Use high accuracy mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // Set the interval ceiling to one minute mLocationRequest.setFastestInterval(Constants.SECONDS_TO_UP); // Set the distance to 10 meters. mLocationRequest.setSmallestDisplacement(Constants.METERS_TO_UP); }
-
Чтобы получать периодические обновления местоположения из служб местоположения, мы отправляем запрос с использованием клиента местоположения.
LocationListener listener = new LocationListener() { @Override public void onLocationChanged(Location location) { Utils.locationUpdates = Utils.locationUpdates + 1; if (Utils.locationUpdates == 1) { mLocationRequest .setPriority(LocationRequest.PRIORITY_LOW_POWER); LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest, listener); } } };