该类可以提供给上层位置服务,我们可以通过它获得地理位置等信息。获得LocationManager对象的方法如下:
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
要使用位置服务需要添加下面的权限:
LocationManager属于系统服务,所以无法通过构造方法的方式new一个对象出来,只能通过获取系统服务,传参的形式得到该对象。得到该对象以后,我们调用它唯一不需要传参的方法,看看得到什么信息:
List list = locationManager.getAllProviders();
if (list != null && list.size() != 0) {
for(String str : list){
Log.i(TAG, "providers: " + str);
}
}
输出信息如下:
03-29 15:51:24.901: I/MainActivity(10015): providers: passive
03-29 15:51:24.911: I/MainActivity(10015): providers: gps
这是LocationProvider对象的名称。一共有3种:passive、gps、network.可惜我的设备只有前两种。拿最熟悉的试试吧:GPS。首先通过获得的name创建LocationProvider对象:
LocationProvider locationProvider = locationManager.getProvider("gps");
有了这个对象,我们就得去LocationProvider类中看看,有什么可以得到信息的方法。调用之,查看之。
// 精度
int accuracy = locationProvider.getAccuracy();
Log.i(TAG, "accuracy: "+accuracy);
//返回所需电量
int powerRequirement = locationProvider.getPowerRequirement();
Log.i(TAG, "powerRequirement: "+powerRequirement);
//是否有使用费
boolean hasMonetaryCost = locationProvider.hasMonetaryCost();
Log.i(TAG, "hasMonetaryCost: "+hasMonetaryCost);
//是否需要使用手机网络:基于手机基站的网络
boolean requiresCell = locationProvider.requiresCell();
Log.i(TAG, "requiresCell: "+requiresCell);
//是否需要使用数据网络:因特莱特
boolean requiresNetwork = locationProvider.requiresNetwork();
Log.i(TAG, "requiresNetwork: "+requiresNetwork);
//是否需要使用基于卫星定位的系统
boolean requiresSatellite = locationProvider.requiresSatellite();
Log.i(TAG, "requiresSatellite: "+requiresSatellite);
//是否提供海拔信息
boolean supportsAltitude = locationProvider.supportsAltitude();
Log.i(TAG, "supportsAltitude: "+supportsAltitude);
//是否提供方位信息
boolean supportsBearing = locationProvider.supportsBearing();
Log.i(TAG, "supportsBearing: "+supportsBearing);
//是否提供速度信息
boolean supportsSpeed = locationProvider.supportsSpeed();
Log.i(TAG, "supportsSpeed: "+supportsSpeed);
Log输出:
03-29 16:25:35.981: I/MainActivity(11509): accuracy: 1
03-29 16:25:35.981: I/MainActivity(11509): powerRequirement: 3
03-29 16:25:35.981: I/MainActivity(11509): hasMonetaryCost: false
03-29 16:25:35.981: I/MainActivity(11509): requiresCell: false
03-29 16:25:35.991: I/MainActivity(11509): requiresNetwork: true
03-29 16:25:35.991: I/MainActivity(11509): requiresSatellite: true
03-29 16:25:35.991: I/MainActivity(11509): supportsAltitude: true
03-29 16:25:36.001: I/MainActivity(11509): supportsBearing: true
03-29 16:25:36.011: I/MainActivity(11509): supportsSpeed: true
前2个数值代表什么意思?会在Criteria类中讲。这里就理解代表一个等级的标识。LocationProvider中还有一个方法:
meetsCriteria (Criteria criteria)
判断该provider是否符合你传入的标准对象所代表的标准。所以我们得先研究标准类Criteria.
每行每业嘛,都是有一个标准在那摆着,位置服务也不例外,它也有标准可依赖。Criteria类中就定义了各种标准(其实也就是字段属性),如果你的LocationProvider符合这个标准,OK,你可以用。该类中就是一系列的set/get方法,所以可以说它是个实实在在的实体类。那么我们就创建criteria对象:
Criteria criteria = new Criteria();
criteria.setAccuracy(2);
criteria.setCostAllowed(true);
boolean meets = locationProvider.meetsCriteria(criteria);
Log.i(TAG, "meets: " + meets);
Log输出:
03-29 17:27:17.241: I/MainActivity(13989): meets: true
从之前我们获得的GPS的精度值为1,但是我们传入的是2它返回的是true。这是为什么呢?其实它的判断标准不是equals来比对的,他是以大于来比对的。比如你要求这个provider的精度为2,那么provider的精度是1,明显高于你的要求,说明什么我达到了你的要求,而且还比你高。
我们从LocationManager起步,一步一步根据方法作为线索,慢慢分析我们所碰到的问题,一步一步解决。了解了LocationProvider类,然后到Criteria类。都有了一个初步的认识,砖已经抛给你了,你自己砌墙吧。
(技术是分享的,我受益于别人,也希望回馈大家。)