是否有替代此调用会强制从硬件中获取新坐标?
locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
我遇到的具体问题是他们使用假GPS来模拟一个位置。他们在启动我的应用程序之前将其关闭,但是当我的应用程序启动并进行上述调用时,它仍然会获得最后给定的模拟位置。
注意:我们已将它作为模拟gps提供程序从Developer Options中删除,并对其进行了强制退出。我们甚至卸载了它。因此,我确信Android本身仍然会缓存之前的模拟值并将其提供给我的应用,因为手机没有移动。
此外,由于Developer Options中没有模拟提供程序,因此Android LocationManager会将缓存的虚假位置报告为非模拟。显然是一个巨大的错误。
我想做的是拨打电话,让手机开启GPS并获取新坐标。不幸的是,我认为没有办法做到这一点......
答案 0 :(得分:2)
简短回答是您必须为所述提供商提出位置请求。提供商需要一个新的位置。
长期以来;
我遇到的具体问题是他们使用假GPS来模拟一个位置。他们在启动我的应用程序之前将其关闭,但是当我的应用程序启动并进行上述调用时,它仍然会获得最后给定的模拟位置。
在正常情况下,getLastKnownLocation
方法返回给定提供程序的缓存位置。因此,在您的情况下,预计会获得模拟位置,因为您的设备尚未获得新的位置
注意:我们已将其作为模拟gps提供程序从Developer Options中删除,并对其进行了强制退出。我们甚至卸载了它。因此,我确定Android本身仍在缓存之前的模拟值并将其提供给我的应用,因为手机没有移动。
那是正确的,因为模拟器应用程序之前设置的位置是为给定的提供者缓存的。它影响整个系统。这就是卸载mocker应用程序后没有清除的原因。您必须为提供商提出位置请求或重新启动设备。
此外,因为Developer Options中没有模拟提供程序, Android LocationManager将缓存的虚假位置报告为NOT 嘲笑。显然是一个巨大的错误。
你是如何测试的?测试时,所有设备的行为都是这样的?也许mocker应用程序是作为系统应用程序安装的,所以它会向LocationManager报告位置并暗示你?
要强制GPS获取位置,您可以轻松使用以下代码。 onLocationChanged方法将由GPS硬件触发。
但请确保模拟位置应用目前无法正常工作。否则,onLocationChanged方法将由mocker app触发!
private void requestLocation(){
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, mListener);
}
private LocationListener mListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// Previously mock location is cleared.
// getLastKnownLocation(LocationManager.GPS_PROVIDER); will not return mock location.
}
...
};
答案 1 :(得分:1)
这是Marshmallow报道的一个问题。 https://code.google.com/p/android/issues/detail?id=227873
答案 2 :(得分:0)
最简单的解决方案是从Android的gps工具中抽象出来。 只需将所有与gps相关的功能提取到单独的界面中,并将其实施以进行测试,而无需使用任何与Android相关的服务。通过这样做,您甚至不需要模拟您的位置(假设您的最终Android实现将正常工作)。您可以以任何方式模拟此测试实现,例如,使用资产中的locatioins打开Json文件并定期将其提供给您的接口。请参阅此文章:http://martinfowler.com/articles/dipInTheWild.html