/// <inheritdoc/> public Task <bool> StopListeningAsync() { if (listener == null) { return(Task.FromResult(true)); } if (listeningProviders == null) { return(Task.FromResult(true)); } var providers = listeningProviders; listener.PositionChanged -= OnListenerPositionChanged; listener.PositionError -= OnListenerPositionError; for (var i = 0; i < providers.Count; i++) { try { Manager.RemoveUpdates(listener); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("Unable to remove updates: " + ex); } } listener = null; return(Task.FromResult(true)); }
/// <summary> /// Start listening for changes /// </summary> /// <param name="minimumTime">Time</param> /// <param name="minimumDistance">Distance</param> /// <param name="includeHeading">Include heading or not</param> /// <param name="listenerSettings">Optional settings (iOS only)</param> public async Task <bool> StartListeningAsync(TimeSpan minimumTime, double minimumDistance, bool includeHeading = false, ListenerSettings listenerSettings = null) { var hasPermission = await CheckPermissions(); if (!hasPermission) { throw new GeolocationException(GeolocationError.Unauthorized); } var minTimeMilliseconds = minimumTime.TotalMilliseconds; if (minTimeMilliseconds < 0) { throw new ArgumentOutOfRangeException(nameof(minimumTime)); } if (minimumDistance < 0) { throw new ArgumentOutOfRangeException(nameof(minimumDistance)); } if (IsListening) { throw new InvalidOperationException("This Geolocator is already listening"); } var providers = Providers; listener = new GeolocationContinuousListener(Manager, minimumTime, providers); listener.PositionChanged += OnListenerPositionChanged; listener.PositionError += OnListenerPositionError; var looper = Looper.MyLooper() ?? Looper.MainLooper; listeningProviders.Clear(); for (var i = 0; i < providers.Length; ++i) { var provider = providers[i]; //we have limited set of providers if (ProvidersToUseWhileListening != null && ProvidersToUseWhileListening.Length > 0) { //the provider is not in the list, so don't use it. if (!ProvidersToUseWhileListening.Contains(provider)) { continue; } } listeningProviders.Add(provider); Manager.RequestLocationUpdates(provider, (long)minTimeMilliseconds, (float)minimumDistance, listener, looper); } return(true); }