如何在Android上强制进行位置更新

时间:2016-10-28 20:25:06

标签: android android-studio locationmanager

是否有替代此调用会强制从硬件中获取新坐标?

locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

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

注意:我们已将它作为模拟gps提供程序从Developer Options中删除,并对其进行了强制退出。我们甚至卸载了它。因此,我确信Android本身仍然会缓存之前的模拟值并将其提供给我的应用,因为手机没有移动。

此外,由于Developer Options中没有模拟提供程序,因此Android LocationManager会将缓存的虚假位置报告为非模拟。显然是一个巨大的错误。

我想做的是拨打电话,让手机开启GPS并获取新坐标。不幸的是,我认为没有办法做到这一点......

3 个答案:

答案 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