#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
. Ваш создает сигнал тревоги, который отправляет намерение, которое принимается вашим получателем, получатель перезапускает службу, если служба была отключена. Но обращайтесь с этим осторожно, потому что это разряжает батарею устройства, и я не рекомендую это!! Только для некоторых специальных бизнес-применений.