为啥模拟位置会跳回真实位置
Posted
技术标签:
【中文标题】为啥模拟位置会跳回真实位置【英文标题】:Why is mock location jumping back to real position为什么模拟位置会跳回真实位置 【发布时间】:2018-12-28 23:01:35 【问题描述】:我添加了一个测试提供者,使用LocationManager.GPS_PROVIDER
作为提供者名称,如此处所述
https://mobiarch.wordpress.com/2012/07/17/testing-with-mock-location-data-in-android/
在 Google 地图应用中,我看到位置在模拟位置和真实位置之间跳跃,然后返回模拟位置。
为什么要跳转到真实位置,我该如何阻止它?
也许我误解了如何使用模拟位置。我没有找到任何可用的官方文档。
【问题讨论】:
【参考方案1】:您的位置设置很可能配置为您的手机(和应用程序)既可以使用来自 GPS 传感器的位置,也可以使用来自手机和 wi-fi 的位置。自从 Fused Location Provider 出现以来,系统获取您的位置的方式变得更加模糊。
当您模拟位置时,您只能模拟 GPS 传感器读数(当您通过模拟器设置模拟位置时也是如此)。 因此,当系统向 Google Maps 提供 GPS 传感器的位置时,它会给出假的,而当它提供来自其他传感器的位置时,它将是真实的。
为了测试我是否正确,您可以将位置设置切换为“仅限设备”,并且您应该只获得虚假位置。
很遗憾,无法模拟其他传感器的读数。
【讨论】:
那么我如何使用模拟位置测试 FusedLocationProviderClient 呢?有没有办法知道 Location 对象的“原始”提供者(得到“融合”)? 就我使用 FusedLocationProvider 的经验而言,您不再能够知道单个位置的来源,这几乎可以肯定是 Play Services Location 库拥有一个提供的 API 的一种方式以与传感器无关的方式定位。该位置附有“准确性”信息,但我还没有找到一种方法将该值与传感器匹配,因为 wi-fi 和单元格提供的位置精度可能会因情况而异。 我尝试了 FusedLocationProviderClient.setMockMode,根据文档:“底层提供程序(网络和 gps)将被停止(通过直接 LocationManager 访问除外),并且只会报告 setMockLocation(Location) 中指定的位置...”但得到 SecurityException:“必须在开发人员设置中选择作为模拟位置应用程序”这没有多大意义,我不希望我的应用程序成为模拟,我只是想切换到模拟模式。 为了模拟你自己的位置,你需要成为一个系统范围内公认的模拟应用程序。这使得 .setMockMode 的存在相当混乱。 我想关闭网络和 gps 肯定是大多数应用程序在没有额外权限的情况下无法做到的事情。如果您处于“测试”模式或某些应用程序变体,模拟位置的一种(坏)方法可能是抽象提供位置的层并切换实现。当然,一旦应用程序在后台被杀死,它就会停止工作,而且它不适用于地理围栏转换。以上是关于为啥模拟位置会跳回真实位置的主要内容,如果未能解决你的问题,请参考以下文章