如何在使用模拟位置时禁用 Android GPS 接收器

How to disable Android GPS receiver while using mock location

在开发依赖于 GPS 定位服务的 Xamarin.Android 应用程序时,我使用单独的自定义应用程序来模拟沿预定义路线的移动。

模拟实现完全按预期工作,正在开发的应用程序正确接收了它的修复。但是,设备的真实 GPS 服务偶尔也会因与模拟位置相矛盾的实际 GPS 定位而中断。

[0:] Position: 37.8623530305552, 27.2595232774193 [Mock]
[0:] Position: 37.8623389227154, 27.2594691972361 [Mock]
[0:] Position: 37.8955245, 27.2769657 
[0:] Position: 37.8623248148509, 27.2594151170736 [Mock]
[0:] Position: 37.8623107069617, 27.2593610369318 [Mock]

我知道我可以过滤掉模拟位置,但这需要硬编码我的消费应用程序以知道它正在使用模拟数据,而我真的希望它不知道位置数据的来源。

我以为调用 LocationManager.AddTestProvider 会暂时禁用真正的 GPS 服务,但事实并非如此。

我做错了什么吗?

对于遇到此问题的任何人,解决方案都非常简单。

尽管我的模拟实施正确地生成了模拟 GPS 定位,但模拟数据偶尔会与设备生成的真实定位相矛盾。

我最初认为这是因为真正的 GPS 提供者没有被适当地抑制,但事实证明不需要的修复来自 network 提供者,这是有道理的,因为我没有尝试嘲笑该提供者。

一个快速的解决方案是将设备的定位模式切换为仅限设备(Android 设置 > 定位 > 模式)。这确保设备将仅使用 GPS 作为其位置数据源。

或者,可以扩展模拟实现以添加模拟 网络 位置提供程序,然后根据 Wi-fi 或蜂窝参考抑制设备位置数据。