【问题标题】:How to get the current Location mode of an android phone?如何获取安卓手机当前的定位模式?
【发布时间】:2014-05-08 15:24:43
【问题描述】:

我看过这个页面:http://developer.android.com/reference/android/provider/Settings.Secure.html#LOCATION_MODE,但我还是迷路了。

我知道位置模式应该返回一个整数。 Battery Saving 为 2,High Accuracy 为 3,如果 GPS 关闭,则返回 0。

抓取当前位置没问题...

LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Location location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

double longitude = location.getLongitude();
double latitude = location.getLatitude();
String stlongitude = Double.toString(longitude);
String stlatitude = Double.toString(latitude);

但是当手机的定位模式设置为仅设备时,我必须使用 LocationManager 的 GPS_PROVIDER。这不如 NETWORK_PROVIDER 准确。我想做一个 if、else 或 case 语句,允许我获取当前位置模式,如果它设置为高精度或省电模式,请使用 NETWORK_PROVIDER,但如果它设置为仅设备使用 GPS_PROVIDER。

【问题讨论】:

    标签: android location


    【解决方案1】:

    如果您只对针对 KitKat 或更高版本 (API 19) 的设备感兴趣,那么您尝试使用 Settings.Secure 和 LOCATION_MODE 执行的操作是获取启用的提供程序的正确方法。但是,您实际上很可能希望您的应用能够与具有早期 Android 版本的设备一起使用。

    以下代码使用用户启用的耗电最少的提供程序获取最后一个位置:

    LocationManager manager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    boolean isGpsEnabled = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    boolean isNetworkEnabled = manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    if (isGpsEnabled && !isNetworkEnabled) {    
        Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    } else {
        Location location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    }
    

    【讨论】:

      【解决方案2】:

      NETWORK_PROVIDER 不如 GPS 准确,

      首先要注意的是,NETWORK_PROVIDER 不如 GPS 准确,根据开发者文档,network prodiver 使用

      NETWORK_PROVIDER
      该提供商根据手机信号塔的可用性确定位置 和 WiFi 接入点。通过网络检索结果 查找。

      检索用户时可以使用的最准确的提供程序,位置是 GPS,由 Andorid 开发者文档定义为:

      GPS_PROVIDER
      该提供商使用卫星确定位置。根据条件,此提供程序可能需要一段时间才能返回位置修复。需要权限 ACCESS_FINE_LOCATION。

      操纵提供者

      考虑到这一点,以下提示将使您能够以任何您希望的方式操纵逻辑:

      1) 要将位置管理器设置为使用设备能够使用的最佳提供商接收更新,您可以调用

      /* Getting the name of the BEST provider available */
      provider = locationManager.getBestProvider(criteria, true);
      
      /* Getting Current Location using the best provider available */
      location = locationManager.getLastKnownLocation(provider);
      locationManager.requestLocationUpdates(provider, 300000, 0, this);
      

      2) 如果您要强制使用网络提供商,请将您的位置管理器设置为要求网络提供商更新,如下所示:

      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, this);
      

      3) 同样,如果你强制使用 GPS:

      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 0, this);
      

      【讨论】:

        【解决方案3】:

        我认为如果您正在寻找 LOCATION_MODE,而不是提供商,您应该查看这个问题和回复:Change Location Mode to High Accuracy Programmatically Android

        因为即使您的所有提供程序都已启用,定位模式也可能意味着如果您在建筑物中并且模式为 LOCATION_MODE_SENSORS_ONLY,它将无法获得良好的位置。

        【讨论】:

          猜你喜欢
          • 2012-10-11
          • 1970-01-01
          • 2017-08-06
          • 2011-12-02
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多