Android中LocationManager学习笔记(1)

LocationManager

 

该类可以提供给上层位置服务,我们可以通过它获得地理位置等信息。获得LocationManager对象的方法如下:

 

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

 

要使用位置服务需要添加下面的权限:

 


	

 

LocationProvider


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

 

每行每业嘛,都是有一个标准在那摆着,位置服务也不例外,它也有标准可依赖。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类。都有了一个初步的认识,砖已经抛给你了,你自己砌墙吧。

 

(技术是分享的,我受益于别人,也希望回馈大家。)

 


 

你可能感兴趣的:(语言学习[Android])