Упрощение использования функции LocationClient поставщика Fused Location

Скажем, у меня есть 5 различных действий в моем приложении, которые хотят использовать LocationClient.getLastLocation(), чтобы получить последнее известное местоположение. Это кажется простым.

В идеале я бы просто создал LocationClient в каждом действии и вызвал getLastLocation(). Однако для подключения к сервисам Google Play необходимо выполнить дополнительную работу, такую ​​как вызов LocationClient.connect() и обработать обратные вызовы onConnected, onDisconnected и onConnectionFailed. Документация находится здесь: https://developer.android.com/training/location/retrieve-current.html

Насколько я могу судить, каждый из моих пяти разных действий должен обрабатывать методы жизненного цикла LocationClient. Они также не могут вызывать getLastLocation() сразу в onCreate(), потому что соединение для этого действия возможно еще не установлено.

Есть ли простой способ упростить жизненный цикл LocationClient, так что getLastLocation() будет работать сразу в любой новой активности, как только я получу соединение, установленное один раз для моего приложения?

Ответ 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 из android google-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);
            }
        }
    };
    

Ответ 2

Вы можете создать службу для работы с плавным провайдером местоположения на фоне, а также передать местоположение и состояние в свою деятельность. См. Ссылку https://gist.github.com/blackcj/20efe2ac885c7297a676