Android中LocationManager的提供了一系列方法来地理位置相关的问题,包括查询上一个已知位置;注册/注销来自某个 LocationProvider的周期性的位置更新;以及注册/注销接近某个坐标时对一个已定义Intent的触发等。今天咱们就来看看Android 中LocatinManager的简单使用,以获取当前所在的位置为例。html
首先,咱们须要获取LocationManager的一个实例,这里须要注意的是他的实例只能经过下面这种方式来获取,直接实例化LocationManager是不被容许的。java
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);android
获得了LocationManager的实例locatonManager之后,咱们经过下面的语句来注册一个周期性的位置更新。git
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 0, locationListener);eclipse
这句代码告诉系统,咱们须要从GPS获取位置信息,而且是每隔1000ms更新一次,而且不考虑位置的变化。最后一个参数是LocationListener的一个引用,咱们必需要实现这个类。ide
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) { //当坐标改变时触发此函数,若是Provider传进相同的坐标,它就不会被触发
// log it when the location changes
if (location != null) {
Log.i("SuperMap", "Location changed : Lat: "
+ location.getLatitude() + " Lng: "
+ location.getLongitude());
}
}函数
public void onProviderDisabled(String provider) {
// Provider被disable时触发此函数,好比GPS被关闭
}spa
public void onProviderEnabled(String provider) {
// Provider被enable时触发此函数,好比GPS被打开
}插件
public void onStatusChanged(String provider, int status, Bundle extras) {
// Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
}
};命令行
以上的这些步骤通常应当在Activity的onCreate()阶段完成。
在成功注册了一个周期性坐标更新之后,咱们就随时能够经过下面的方法来取得当前的坐标了。
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double latitude = location.getLatitude(); //经度
double longitude = location.getLongitude(); //纬度
double altitude = location.getAltitude(); //海拔
不过这时候,若是你尝试去运行这个LocationSample的话程序启动时多半就会报错,由于咱们没有设置GPS相关的权限,解决方法也至关简单,在AndroidManifest.xml中的block里添加下面这句便可解决权限的问题。详细的权限设置,请参考官方文档docs/reference/android/Manifest.permission.html
若是是在模拟器中调试的话,咱们有两种方法来设置一个模拟的坐标值,第一种是经过DDMS,咱们能够在eclipse的ADT插件中使用这种方法,只要打开"Window" --> "Show View" 中打开"Emulator Control" View便可看到以下的设置窗口,咱们能够手动,或者经过KML和GPX文件来设置一个坐标。
另外一种方法是使用geo命令,咱们须要telnet到本机的5554端口,而后在命令行下输入相似于 geo fix -121.45356 46.51119 4392 这样的命令,后面三个参数分别表明了经度、纬度和(可选的)海拔。