即使启用了所有位置服务,Google 位置服务 getBestProvider 也会返回 null

Posted

技术标签:

【中文标题】即使启用了所有位置服务,Google 位置服务 getBestProvider 也会返回 null【英文标题】:Google Location Services getBestProvider will return null even though all location services are enabled 【发布时间】:2013-06-21 01:59:49 【问题描述】:

即使地图应用程序显示正确的位置,位置服务 getBestProvider 调用仍返回 null。 FINE_LOCATION 和 COARSE_LOCATION 的权限在清单中。

public static Location getLocation(Context context) 
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    Location myLocation = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
    return myLocation;

非常感谢任何帮助,因为这是我第一次使用定位服务。提前谢谢你。

【问题讨论】:

我猜你也在使用 【参考方案1】:

无论您使用哪个提供商 GPS、NETWORK 或最好的,都遵循从本地(在设备上)缓存中获取位置的相同原则。

试试这个实验。更改您的physical 位置(四处走动,距您现在的位置约 200m)并加载谷歌地图,突然间您的应用程序也会返回正确的坐标。那是因为谷歌地图知道如何触发本地缓存更新。我(幸运的是)找到了触发缓存更新的方法。

在你的 getLastKnownLocation 和魔法发生之前调用它。

HomeScreen.getLocationManager().requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() 
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) 
            
            @Override
            public void onProviderEnabled(String provider) 
            
                @Override
            public void onProviderDisabled(String provider) 
            
            @Override
            public void onLocationChanged(final Location location) 
        
    );

或者使用 LocationClient。用于位置更新的新 API。

【讨论】:

这就是解决方案。我不得不在提供者上调用 requestLocationUpdates。 getLastKnownLocation 返回 LAST KNOWN 位置,如果您想要 CURRENT 位置,您显然必须请求更新!如果您想要一个位置,请使用requestSingleUpdate。使用requestLocationUpdates0, 0 将触发定期更新并耗尽电池!将日志行添加到 onLocationChanged 以查看它被调用的频率。 我将对其进行测试并相应地编辑我的答案。谢谢。【参考方案2】:

尝试使用 locationmanager.getBestProvider() 的插入,看看它现在是否有效:

String locationProvider = LocationManager.NETWORK_PROVIDER;
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);

此外,如果您将 false 传递给 getBestProvider(),无论是否打开,它都会返回最佳 Provider,它仅取决于您的 Criteria,因此它可能会返回 null,例如,如果您没有手动启用 GPS。

您可能需要查看此链接:http://developer.android.com/reference/android/location/LocationManager.html#getBestProvider(android.location.Criteria, boolean)

【讨论】:

您上面提到的答案已包含在我的答案中。不管你选择哪一个,你能把这篇文章标记为已回答吗?谢谢 事实证明这不是解决方案。我刚刚注意到这是您答案的一部分。 悉达多有正确的解决方案。我只需要拨打 GPS、NETWORK 和 PASSIVE 提供商的电话。【参考方案3】:

我建议你使用新的 location api,你可以在 google_play_services_lib (https://github.com/chrulri/google-play-services_lib) 中找到它。只需将其作为 android 库项目添加到您的项目中即可。这个库的最大优点是您不必处理 GPS 和 NETWORK 的东西,它会自动决定使用哪一个。

在此处了解更多信息:

https://developer.android.com/google/play-services/location.html

【讨论】:

以上是关于即使启用了所有位置服务,Google 位置服务 getBestProvider 也会返回 null的主要内容,如果未能解决你的问题,请参考以下文章

即使在后台,如何使用 Google 位置服务 API 来获取位置更新?

Android:使用 Fused Location Provider 检查是不是启用了位置服务

如何从 Google Play 服务中弹出启用蓝牙提示?

使用 Fused Location Provider 获取启用/禁用位置服务的信息

Google 位置服务现在是不是遇到问题?

为特定应用启用定位服务?