GPS开发是如今当前Android开发较为常用的工具。它的开发主要获取定位点的经度纬度,卫星个数,卫星型号等相关数据。
主要运用的LocationManager定位管理器获取相关定位信息。
开发流程如下:
1,初始化管理器
2,获取地理位置信息查询条件
3,监听状态
4,监听位置信息
5,启用GPS.
6,关闭GPS
一,初始化GPS定位管理器:
LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
// 判断GPS是否正常启动
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
// ErrorHandler.showError("GPS未正常启动,请开启后重试!");
DialogPrompt.showDialogPrompt(context, handler,"GPS未正常启动,是否打开GPS设置页面!", 10);
return;
}
// 为获取地理位置信息时设置查询条件
String bestProvider = manager.getBestProvider(getCriteria(), true);
// 获取位置信息
// 如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER
Location location = manager.getLastKnownLocation(bestProvider);
二,获取地理位置查询条件
调用方法:
LocationManager.getBestProvider(getCriteria(), true);
条件设置:
private Criteria getCriteria() {
Criteria criteria = new Criteria();
// 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 设置是否要求速度
criteria.setSpeedRequired(true);
// 设置是否允许运营商收费
criteria.setCostAllowed(false);
// 设置是否需要方位信息
criteria.setBearingRequired(true);
// 设置是否需要海拔信息
criteria.setAltitudeRequired(true);
// 设置对电源的需求
criteria.setPowerRequirement(Criteria.POWER_LOW);
return criteria;
}
三,监听状态信息GpsStatus.Listener
通过调用LocationManager.addGpsStatusListener(GpsStatus.Listener);监听GPS当前信息和状态:
// 状态监听GpsStatus.Listener listener = new GpsStatus.Listener() {public void onGpsStatusChanged(int event) {switch (event) {// 第一次定位case GpsStatus.GPS_EVENT_FIRST_FIX:Log.i(TAG, "第一次定位");break;// 卫星状态改变case GpsStatus.GPS_EVENT_SATELLITE_STATUS:callback.GpsState(true);Log.i(TAG, "卫星状态改变");// 获取当前状态GpsStatus gpsStatus = manager.getGpsStatus(null);// 获取卫星颗数的默认最大值int maxSatellites = gpsStatus.getMaxSatellites();// 创建一个迭代器保存所有卫星
Iteratoriters = gpsStatus.getSatellites()
.iterator();
int count = 0;
int maxcount=0;
float snr = 0;
float azimuth=0;
map.clear();
while (iters.hasNext() && maxcount <= maxSatellites) {
GpsSatellite s = iters.next();
azimuth=s.getAzimuth();//方位角
s.getElevation();//仰角
snr=s.getSnr();//信噪比
if (snr>0) {
count++;
if (map.size()>15) {
map.clear();
}else{
map.put(count, snr);
}
}
maxcount++;
}
callback.GpsreturnMoon(map, count, maxcount,azimuth);
System.out.println("搜索到:" + count + "颗卫星");
break;
// 定位启动
case GpsStatus.GPS_EVENT_STARTED:
Log.i(TAG, "定位启动");
callback.GpsState(true);
break;
// 定位结束
case GpsStatus.GPS_EVENT_STOPPED:
Log.i(TAG, "定位结束");
callback.GpsState(false);
break;
}};};
四,监听位置信息LocationListener
// 位置监听private LocationListener locationListener = new LocationListener() {/** * 位置信息变化时触发 */public void onLocationChanged(Location location) {Log.i(TAG, "时间:" + location.getTime());Log.i(TAG, "经度:" + location.getLongitude());Log.i(TAG, "纬度:" + location.getLatitude());Log.i(TAG, "海拔:" + location.getAltitude());updateView(location);}/** * GPS状态变化时触发 */public void onStatusChanged(String provider, int status, Bundle extras) {switch (status) {// GPS状态为可见时case LocationProvider.AVAILABLE:Log.i(TAG, "当前GPS状态为可见状态");Location location = manager.getLastKnownLocation(provider);callback.GpsState(true);break;// GPS状态为服务区外时case LocationProvider.OUT_OF_SERVICE:Log.i(TAG, "当前GPS状态为服务区外状态");callback.GpsState(false);break;// GPS状态为暂停服务时case LocationProvider.TEMPORARILY_UNAVAILABLE:Log.i(TAG, "当前GPS状态为暂停服务状态");callback.GpsState(false);break;}}/** * GPS开启时触发 */public void onProviderEnabled(String provider) {callback.GpsState(true);Location location = manager.getLastKnownLocation(provider);updateView(location);}/** * GPS禁用时触发 */public void onProviderDisabled(String provider) {callback.GpsState(false);}};HashMapmap=new HashMap();// 状态监听GpsStatus.Listener listener = new GpsStatus.Listener() {public void onGpsStatusChanged(int event) {switch (event) {// 第一次定位case GpsStatus.GPS_EVENT_FIRST_FIX:Log.i(TAG, "第一次定位");break;// 卫星状态改变case GpsStatus.GPS_EVENT_SATELLITE_STATUS:callback.GpsState(true);Log.i(TAG, "卫星状态改变");// 获取当前状态GpsStatus gpsStatus = manager.getGpsStatus(null);// 获取卫星颗数的默认最大值int maxSatellites = gpsStatus.getMaxSatellites();// 创建一个迭代器保存所有卫星Iteratoriters = gpsStatus.getSatellites()
.iterator();
int count = 0;
int maxcount=0;
float snr = 0;
float azimuth=0;
map.clear();
while (iters.hasNext() && maxcount <= maxSatellites) {
GpsSatellite s = iters.next();
azimuth=s.getAzimuth();//方位角
s.getElevation();//仰角
snr=s.getSnr();//信噪比
if (snr>0) {
count++;
if (map.size()>15) {
map.clear();
}else{
map.put(count, snr);
}
}
maxcount++;
}
callback.GpsreturnMoon(map, count, maxcount,azimuth);
System.out.println("搜索到:" + count + "颗卫星");
break;
// 定位启动
case GpsStatus.GPS_EVENT_STARTED:
Log.i(TAG, "定位启动");
callback.GpsState(true);
break;
// 定位结束
case GpsStatus.GPS_EVENT_STOPPED:
Log.i(TAG, "定位结束");
callback.GpsState(false);
break;
}
};
};
五,启用GPS服务
LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,1,
LocationListener);
六,关闭GPS服务
LocationManager.removeUpdates(LocationListener);