使用Play服务定位API检查Android位置服务是否已启用

25
您可以使用LocationManager确定是否有任何提供程序可用,但是使用Google Play服务位置API是否可以达到目的?
实际上,当未启用任何内容时,“访问我的位置”处于关闭状态,所有API调用(connect(),requestLocationUpdates())都成功,但您永远不会收到onLocationChanged()。
同时使用LocationManager和LocationClient似乎很愚蠢。
我想我需要某种方式知道onLocationChanged(0将从不被调用。
4个回答

26

我已经查阅了文档,但并没有发现使用LocationClient来检测位置服务是否已启用的方法。onConnected、onDisconnected和onConnectionFailed似乎与位置服务的启用或禁用无关。

目前,我正在使用LocationClient进行位置请求,但是使用旧的locationManager.isProviderEnabled(String provider)方法来检测位置服务是否已启用。对我来说这是最佳选择,因为即使LocationClient提供了一种方法,它也不会区分GPS和网络,而我真的很想要能够请求用户启用GPS。

if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
    //GPS Provider disabled
    return false;
}

我也觉得这很奇怪! - Bear
5
如果(lm.isProviderEnabled(LocationManager.GPS_PROVIDER) || lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {},我认为这是最完整的方法。 - Diolor

12
自从Google Play Services 7.3.0版本以来,现在有一种可靠的方法来检测位置更新是否可用:
实施并注册一个LocationCallback,并覆盖onLocationAvailability()或调用LocationServices.FusedLocationApi.getLocationAvailability()来检索可用性状态。如果为false,则已知除非设备配置发生更改,否则不会传递位置更新。
这种方法实际上非常聪明:例如,即使网络位置提供程序始终启用,它也能确定WiFi-only设备无法传递位置更新,如果禁用了WiFi或设备处于飞行模式。

文档说明:返回位置数据的可用性。当isLocationAvailable()返回true时,getLastLocation(GoogleApiClient)返回的位置将在活动LocationRequests指定的提示范围内相对最新。据我理解,这显示当前是否有某些位置数据可用,而不是位置服务是否已启用。 - lujop
这个方法只是通知位置不会被传递,但它并没有说明原因,而且它可能由于许多原因返回false。 - B-GangsteR
您可以使用SettingsClient提前确定位置请求是否成功,并获取有关不可用性的更多信息:https://developers.google.com/android/reference/com/google/android/gms/location/SettingsClient - BladeCoder

4

Google Play服务7.0引入了设置API,您可以请求所需的位置设置,然后查询它们是否已启用或要求用户启用它们。


0

这对我有效。在亚马逊平板电脑和三星S7上进行了测试。

 if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS) {
            //Google Play services are available
    } else {
            //Google Play services are not available on this device
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接