Per lo sviluppo per Windows Phone, Visual Studio 2010 e l'emulatore sono due ottimi strumenti che permettono un facile debugging e testing delle applicazioni. La maggior parte delle caratteristiche sono simulate, come effettuare chiamate oppure ruotare il dispositivo, ma non è possibile testare il GPS incorporato nel dispositivo.
Questo in realtà non è un problema, perché la soluzione più rapida è sicuramente provare sul dispositivo fisico. Questa pratica però è scomoda e non permette di simulare situazioni o avere dati con un significato valido, perciò è utile poter sviluppare un finto GPS che permetta di testare l'applicazione creando una situazione verosimile.
Tutto questo è possibile grazie all'interfaccia IGeoPositionWatcher
IGeoPositionWatcher<GeoCoordinate> watcher; if (Microsoft.Devices.Environment.DeviceType == Microsoft.Devices.DeviceType.Device) { watcher = new GeoCoordinateWatcher(); } else { watcher = new FakeGeoPositionWatcher(); } // Intercetto gli eventi e avvio watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged); watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged); watcher.Start();
L'implementazione di FakeGeoPositionWatcher non fa altro che supportare gli eventi StatusChanged e PositionChanged, e scatenare ad intervalli regolari il cambio di posizione simulando lo spostamento del segnale GPS. Di seguito l'implementazione completa:
public class FakeGeoPositionWatcher : IGeoPositionWatcher<GeoCoordinate> { private AsyncOperation operation; private Timer timer; // Posizione iniziale private GeoPosition<GeoCoordinate> position = new GeoPosition<GeoCoordinate>(DateTimeOffset.Now, new GeoCoordinate(45.477827, 9.310956, 0, 30, 30, 0, 0)); public GeoPosition<GeoCoordinate> Position { get { return position; } } public GeoPositionStatus Status { get; set; } public event EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>> PositionChanged; public event EventHandler<GeoPositionStatusChangedEventArgs> StatusChanged; public void Start(bool suppressPermissionPrompt) { if (timer == null) { operation = AsyncOperationManager.CreateOperation(null); // Timer per scatenare il cambio di posizione timer = new Timer(Raise, null, 0, 5000); // Scateno lo startup if (StatusChanged != null) StatusChanged(this, new GeoPositionStatusChangedEventArgs(GeoPositionStatus.Initializing)); if (StatusChanged != null) StatusChanged(this, new GeoPositionStatusChangedEventArgs(GeoPositionStatus.Ready)); } } public void Start() { this.Start(false); } public void Stop() { if (timer != null) timer.Dispose(); timer = null; } public bool TryStart(bool suppressPermissionPrompt, TimeSpan timeout) { this.Start(); return true; } private void Raise(object s) { operation.Post(st => { this.Position.Location = new GeoCoordinate(this.Position.Location.Latitude, this.Position.Location.Longitude + 0.0002, this.Position.Location.Altitude + 0.0002, Math.Max(2, this.Position.Location.HorizontalAccuracy - 5), Math.Max(2, this.Position.Location.VerticalAccuracy - 5), this.Position.Location.Speed, this.Position.Location.Course); if (PositionChanged != null) PositionChanged(this, new GeoPositionChangedEventArgs<GeoCoordinate>(this.Position)); }, null); } }
Da notare che gli eventi, per mantenere la stessa caratteristica dell'implementazione reale, devono essere scatenati sul thread UI. Per farlo si fa uso della classe AsyncOperationManager di cui è possibile trovare un approfondimento all'indirizzo
https://www.silverlightitalia.com/articoli/silverlight/multithreading-silverlight-2.0.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire i worklow di GitHub su runner potenziati
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Testare il failover sulle region in Azure Storage
Managed deployment strategy in Azure DevOps
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Referenziare un @layer più alto in CSS
Migliorare l'organizzazione delle risorse con Azure Policy
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Utilizzare Copilot con Azure Cosmos DB
Proteggere le risorse Azure con private link e private endpoints
Eseguire query per recuperare il padre di un record che sfrutta il tipo HierarchyID in Entity Framework
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
I più letti di oggi
- .NET Core 3, C#8 and beyond
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il pattern matching per semplificare le espressioni
- Ecco il Silverlight for Windows Phone Tooolkit aggiornato a Windows Phone 7.5 Mango
- ASP.NET MVC 4
- Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
- Gestione CSS in Blazor con .NET 9