#android #xamarin #gps #fusedlocationproviderapi
#Android #xamarin #gps #fusedlocationproviderapi
Вопрос:
Я разрабатываю приложение для мониторинга GPS, но у меня возникают проблемы с получением обновлений GPS, когда приложение работает в фоновом режиме. Во время маршрута GPS перестает обновляться и запускается снова только через некоторое время.
Я использую API FusedLocationProviderClient со следующими параметрами:
return new LocationRequest()
.SetInterval( 2000 )
.SetFastestInterval( 500 )
.SetSmallestDisplacement(1)
.SetPriority( LocationRequest.PriorityHighAccuracy );
Я использую гибридный сервис для отслеживания обновлений gps.
Когда я запускаю приложение, я привязан с помощью этого:
public PortalCorridaServiceConnection BindService() {
if( ServiceConnection == null ) {
ServiceConnection = new PortalCorridaServiceConnection( Activity );
Intent intentService = new Intent( Activity, typeof( PortalCorridaService ) );
Activity.BindService( intentService, ServiceConnection, Bind.AutoCreate );
}
return ServiceConnection;
}
И когда нажата кнопка «Начать отслеживание», я запускаю свой сервис на переднем плане следующим образом
public void StartForegroundService() {
MakeToast( "Servico iniciado em foreground" );
Intent intent = new Intent( Activity, typeof( Engine.PortalCorridaService ) );
if( Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O ) {
Activity.StartForegroundService( intent );
} else {
Activity.StartService( intent );
}
}
public void RegisterForegroundService() {
// Instantiate the builder and set notification elements:
NotificationCompat.Builder builder = new NotificationCompat.Builder( this, "PORTALCORRIDA" )
.SetContentTitle( "Portal da Corrida" )
.SetContentText( "Estamos monitorando sua corrida" )
.SetSmallIcon( Resource.Drawable.ic_media_play_light );
// Build the notification:
MainNotification = builder.Build();
// Get the notification manager:
NotificationManager notificationManager = GetSystemService( Context.NotificationService ) as NotificationManager;
// Publish the notification:
//const int notificationId = 0;
//notificationManager.Notify( notificationId, notification );
// Enlist this instance of the service as a foreground service
StartForeground( SERVICE_RUNNING_NOTIFICATION_ID, MainNotification );
}
И затем я звоню
fusedLocationProviderClient.RequestLocationUpdatesAsync( CreateLocationRequest(), locationCallback );
Ошибка разрыва GPS
прямая линия между стрелками — это разрыв.
Я также попробовал приложение на другом смартфоне с теми же результатами
Могу ли я что-нибудь сделать, чтобы улучшить обновления GPS?
Ответ №1:
Нет никаких гарантий, что у вас всегда будет прием GPS.
Отсутствие GPS может быть вызвано несколькими факторами, например, отсутствием надлежащего обзора для нескольких спутников, но это также может быть связано с тем, что ваш телефон пытается сэкономить заряд батареи, и ваша ОС решает отключить GPS. Точные правила отключения GPS не очень хорошо документированы как для iOS, так и для Android, но имеет смысл, что фоновые службы или приложения, которые не имеют фокуса, как правило, отключают GPS раньше.
Если (по какой-либо причине) GPS отсутствует, ваш телефон может прибегнуть к альтернативным методам, таким как триангуляция вышек сотовой связи GSM, или узнать местоположения Wi-Fi, если они находятся в поле зрения. Это намного экономичнее для батареи.
Но обратите внимание, что если ваше местоположение определяется вышками GSM, ваша точность сильно падает, и если используются близлежащие маршрутизаторы WiFi, диспетчер местоположений продолжает возвращать местоположение каждую секунду, но это будут одни и те же координаты каждый раз, когда что-то меняется (например, GPS возвращается или найден новый маршрутизатор WiFi).
В таких случаях вы также увидите, что вы испытываете.
Конечно, вы также можете столкнуться с тем, что операционная система останавливает ваше приложение или службу по другим причинам..
Комментарии:
1. Спасибо за ответ. Я знаю, что ошибка заключается в том, что когда я начинаю отслеживать с помощью своего приложения и другого приложения, такого как run keeper и т.д., Другое приложение отслеживает без пробелов
2. @BrunoCerquiare: наиболее вероятная причина в том, что ваше приложение не находится на переднем плане, и ваша ОС решает, что это пустая трата батареи. Есть несколько способов обойти это. Вы могли бы, например, создать «службу переднего плана» для сбора данных GPS. Смотрите: developer.android.com/guide/components/services.html#Foreground .