说明一下,我这里假设您的Android手机已经打开了GPS,故不再判断是否打开GPS功能。
首先,GPS是Android手机的一项系统服务,当然要在程序中允许定位这项权限了,在AndroidManifest.xml文档中添加权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
在onCreate()方法里面,首先要定义UI,然后我们开启定位这项服务(注:实际项目中可要判断是否GPS已打开啊)
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
这里,GPS定位是需要时间的,我们不应该让用户长时间等待下去吧,所以,我先把上一次GPS定位的信息获取到,显示出来,好像很多朋友都是这样做的哦!
private Location getLocationProvider( LocationManager locationManager) { Location retLocation = null; Criteria myCriteria = new Criteria(); myCriteria.setAccuracy(Criteria.ACCURACY_FINE); // 定位程度-->>良好 myCriteria.setAltitudeRequired(true); // 是否需要高度信息 myCriteria.setBearingRequired(true); // 是否需要返回相对位置信息 myCriteria.setCostAllowed(true);// 是否需要收费 myCriteria.setPowerRequirement(Criteria.POWER_LOW); myCriteria.setSpeedRequired(true);// 是否提供速度信息 strLocationProvider = locationManager.getBestProvider(myCriteria, true); retLocation = locationManager. getLastKnownLocation(strLocationProvider); return retLocation; }
这样,就可以把最近的一次定位信息显示在UI上了!
然后,我们就要监听一下GPS的地理位置是否改变,更新一下这个Location了。Android的LocationManager中提供了requestLocationUpdates方法,专门用来监听GPS地理位置的变化。
locationManager.requestLocationUpdates(strLocationProvider, 100, 10, myLocationListener); //【strLocationProvider=”gps”】
最后,关键就是实现这个LocationListener类型的myLocationListener接口来处理Location信息改变了。
public final LocationListener myLocationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { // 当 Provider已离开服务范围时 } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(Location location) { // 当手机收到位置更改时,将location传入取得地理坐标 //在这里面我们可以对更新的location进行处理了。 } };
OK,Android调用GPS功能就这么简单了。但是,我们知道,GPS定位是很慢的,而且有一个不可容忍的问题,就是GPS在室内是无法定位的,为了解决这个室内定位的问题,我们就引入了AGPS定位,即根据手机附近基站来访问GPS,同时根据信号强弱获取一个近似准确的定位信息,我做了测试,在保留四位小数的情况下,经纬度偏差大约是0.01,大概是11米了,最近在论坛上看了一些公司的产品,其中有个公司声称获取当前设备附近的6个基站信息,经过迭代可以更大程度的的提高经纬度信息。看了一些文献,提出关于多基站定位的算法采用了对多基站的位置信息加上信号强弱进行最小二乘迭代,可以提高定位精度但是可惜不能看到具体算法,最近一直在研究这块,不知道对于精度的提高上,不知道有没有朋友研究更深的 给点资料,多谢了。
下面还有我的GPS、AGPS定位、获取手机附近基站列表的demo下载连接,不太想贴代码了,自己下下来研究吧。
Demo源码下载链接:
http://pan.baidu.com/share/link?shareid=530191&uk=3356814091