Получение точной истории пути с помощью фоновой службы в Android

#java #android #android-gps

#java #Android #android-gps

Вопрос:

Мне нужна для моего приложения служба, которая постоянно отслеживает местоположение телефонов. Он используется для создания пути, по которому прошел пользователь, будет отображаться в приложении и должен быть различим между ходьбой и другими способами передвижения. Местоположение должно быть с высокой точностью в сочетании с временными метками и скоростью и сохранено в базе данных sql Lite для дальнейшего использования в моем приложении.

Каков наилучший способ решения этой проблемы? Я столкнулся с тем, что фоновые службы не могли достаточно часто получать местоположение. Моим последним средством было бы сделать его сервисом переднего плана, но, возможно, у кого-то уже есть решение этой проблемы. (например, возможно ли получить данные о местоположении, которые отслеживает Google, в удобном формате?) Заранее спасибо!

Редактировать: Мне жаль, что я недостаточно ясен. Проблема в том, что в ходе своего исследования я обнаружил, что существует несколько способов получить необходимые данные. Диспетчер местоположений и объединенная локация. Все это ограничено тем, как часто вам разрешено получать данные GPS, когда служба работает в фоновом режиме, что может снизить точность определения маршрута. Некоторые решения должны были сделать его сервисом переднего плана, чтобы он не страдал от тех же ограничений, но это не то, что я хочу реализовать.

Чтобы сформулировать более точный вопрос: каков наилучший способ сбора точных (!) Данные о местоположении GPS в течение длительного времени с использованием фоновой службы, не затрачивая при этом слишком много энергии? Он также может быть пакетным, поскольку он не используется в режиме реального времени, а для оценки позже.

Ответ №1:

Попробуйте просто задавать конкретные вопросы. В противном случае никто не знает, как помочь или ответить вам. Поскольку вы новичок на этой платформе, я постараюсь изо всех сил ответить на ваш вопрос.

Прежде всего. «Данные, которые отслеживает Google», взяты из type Location . Вы можете запросить обновления местоположения с помощью LocationManager .

Просто зарегистрируйтесь для получения обновлений местоположения внутри вашего предпочтительного класса:

     # Get Instance of LocationManager
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    # Create Criteria / What Accuracy of do you need? No Requirement means also very week locations will be used
    Criteria gpsCriteria = new Criteria();
    gpsCriteria.setAccuracy(Criteria.NO_REQUIREMENT);
    gpsCriteria.setAltitudeRequired(false);
    gpsCriteria.setBearingAccuracy(Criteria.NO_REQUIREMENT);
    gpsCriteria.setCostAllowed(false);
    gpsCriteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
    // Get the wanted provider
    String gpsProvider = locationManager.getBestProvider(gpsCriteria, true);

    // Request for Location Updates your Class must implement a LocationListener Every second a location is received
    locationManager.requestLocationUpdates(gpsProvider, 1000, 0, this);
    Location location = locationManager.getLastKnownLocation(gpsProvider);
 

В вашем классе вы реализуете LocationListener, как упоминалось выше. При onLocationChange этом вы получаете обновления местоположения устройства. Я не знаю, как вы хотите отобразить дорожку пользователя. Но вы можете получить широту и долготу из этого объекта location. У вас также есть такие показатели, как качество и т.д.

 @Override
public void onLocationChanged(Location location) {
     location.getLatitude() ...
}
 

Если вы хотите постоянно отслеживать местоположение, вам нужно реализовать BackgroundService. Ваш запрос об обновлениях местоположения в onStartCommand . Однако вам необходимо обрабатывать DeepSleep и другие функции, которые переводят устройство в спящий режим. Но вы можете справиться с этим с WakefulBroadcastReciever помощью и AlarmManager . Ваш создает сигнал тревоги, который отправляет намерение, которое принимается вашим получателем, получатель перезапускает службу, если служба была отключена. Но обращайтесь с этим осторожно, потому что это разряжает батарею устройства, и я не рекомендую это!! Только для некоторых специальных бизнес-применений.