如何获得Android手机的当前位置模式?

时间:2014-03-28 23:52:20

标签: android location

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

我知道位置模式应该返回一个整数。电池节省为2,高精度为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语句,允许我获得当前位置模式,如果设置为High Accuracy或Battery saving,请使用NETWORK_PROVIDER,但如果设置为Device Only,则使用GPS_PROVIDER。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

NETWORK_PROVIDER不如GPS准确

首先要注意的是NETWORK_PROVIDER不如GPS准确,根据开发人员文档,网络prodiver使用

  

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

您在检索用户时可以使用的最准确的提供商,位置是GPS,由Andorid Developer docs定义为:

  

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);

答案 2 :(得分:0)

我认为如果您正在寻找LOCATION_MODE而不是提供商,您应该查看此问题并回复:Aegis Implicit Mail (AIM)

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