如何在Android上强制位置更新



是否有一种替代方法可以强制从硬件获取新的坐标?

locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

我遇到的具体问题是他们使用假GPS来模拟位置。他们在启动我的应用程序之前关闭它,但是当我的应用程序启动并进行上述调用时,它仍然获得最后给定的模拟位置。

注意:我们已经从开发者选项中删除了它作为模拟gps提供程序,并对它进行了强制退出。我们甚至卸载了它。所以我确信Android本身仍然在缓存先前的模拟值,只是把它提供给我的应用程序,因为手机没有移动。

此外,因为在开发者选项中没有mock提供程序,Android LocationManager报告缓存的假位置为NOT mock。这显然是个大bug。

我想做的是打一个电话,强制手机打开GPS并获取新的坐标。不幸的是,我没有办法做到这一点。

简短的回答是,您必须为上述提供程序发出位置请求。提供程序需要一个新的位置。

长答案是;

我遇到的具体问题是他们使用假GPS来模拟位置。他们在启动我的应用程序之前关闭它,但是当我的应用程序启动并进行上述调用时,它仍然获得最后给定的模拟位置。

在正常情况下,getLastKnownLocation方法返回给定提供者的缓存位置。因此,在您的情况下,获得模拟位置是预期的,因为您的设备尚未接收到新的位置

注意:我们已经从开发者选项中删除了它作为模拟gps提供程序,并对它进行了强制退出。我们甚至卸载了它。所以我确信Android本身仍然在缓存先前的模拟值,只是把它提供给我的应用程序,因为手机没有移动。

这是正确的,因为模拟应用程序先前设置的位置被缓存为给定的提供商。它会影响整个系统。这就是为什么在卸载mock应用程序后它没有被清除。你必须向提供商发出位置请求或重启设备。

另外,因为在Developer Options中没有mock提供程序,Android LocationManager报告缓存的假位置为NOT嘲笑。这显然是个大bug。

你是怎么测试的?所有设备在测试时都是这样的?也许mock应用是作为系统应用安装的,所以它向LocationManager报告位置并伪装你?


强制GPS获取位置,您可以轻松使用下面的代码。onLocationChanged方法将由GPS硬件触发。

但要确保模拟位置应用程序此时不工作。否则,onLocationChanged方法会被mock应用触发!

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. 
    }
    ...
};

这是棉花糖报告的问题。https://code.google.com/p/android/issues/detail?id=227873

最简单的解决方案是从Android的gps工具中抽象出来的。只需提取所有与gps相关的功能到单独的接口,并实现它的测试,而不使用任何Android相关的服务。通过这样做,你甚至不需要模拟你的位置(假设,你最终的Android实现将正常工作)。您可以以任何方式模拟这个测试实现,例如,打开带有资产位置的Json文件,并定期将其提供给您的接口。查看本文:http://martinfowler.com/articles/dipInTheWild.html

最新更新