Android学习笔记--用户定位User Location
用户定位
User Location的作用:
1.获取用户的位置
2.追踪用户的移动
User Location的关键API
1.Location Manager:用于管理Android的用户定位服务
2.Location Providers:提供多种定位方式供开发者选择。
定位方式的分类:
1.GPS定位:使用GPS卫星进行定位,需要在AndroidManifest.xml当中声明如下权限:
2.NETWORK定位:使用信号接收塔和WIFI接入点进行定位,需要在AndroidManifest.xml当中声明如下权限:
获取用户的当前位置:
1.在AndroidManifest.xml当中声明相应的权限;
2.获取LocationManager对象;
3.选择LocationProvider;
4.绑定LocationListener对象。
LocationListener有四个方法:
1.onLocationChanged(Location location):当设备的位置发生改变时调用
2.onProviderDisabled(String provider):当提供数据Provider禁用时调用
3.onProviderEnabled(String provider):当提供数据的Provider使用时调用
4.onStatusChanged(String provider,int status,Bundle
extras):当状态改变时
我们需要实现LocationListener的以上四个方法:
private class TestLocationListener implements LocationListener{ @Override public void onLocationChanged(Location location){ System.out.println(location.getLongitude()); System.out.println(location.getLatitude()); } @Override public void onProviderDisabled(String provider){ // do something you need } @Override public void onProviderEnabled(String provider){ // do something you need } @Override public void onStatusChanged(String provider,int status,Bundle extras){ // do something you need } }
下面假设我们以一个按钮来触发事件:
private class ButtonListener implements OnClickListener{ @Override public void onClick(View v){ // 得到LocationManager对象 LocationManager locationManager = (LocationManager)YourActivity.this.getSystemService(Context.LOCATION_SERVICE); // requestLocationUpdates(String provider,long minTime,float minDistance,LocationListener listener) // 第一个参数,定义当前所使用的Location Provider // 第二个参数,指示更新的最小时间,但并不是确定的,可能更多或更小 // 第三个参数,两次定位之间的最小距离,单位米。 // 第四个参数,监听器 LocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,new TestLocationListener()); }
这样,我们就完成了一个简单的定位测试。
测试的时候,我们可以用到DDMS里的模拟器控制台,来向设备发送一个经纬度,以模拟卫星返回的定位数据。
那么有哪些Provider呢?
我们可以生成LocationManager对象,然后调用其public
List<String>
getAllProviders()方法,来返回所有的Provider,类型为List<String>。
List<String> providers = locationManager.getAllProviders(); for(Iterator iterator = providers.iterator();iterator.hasNext();){ String provider = (String)iterator.next(); System.out.println(provider); // and do something you need }
迭代器的使用就不再赘述了。
我们可以看到,打印输出的结果有:network,passive,gps。
其中主要用到的是network和gps。
那么我们怎样找到最佳的Location Provider呢?
Android给我们提供了一个查询功能的Criteria。
Criteria可以设置一系列的查询条件,用于查找当前设备当中符合条件的Location Provider。
查询条件:
我们创建一个Criteria对象,然后调用上面的方法进行条件设定。
然后Android系统就会根据我们的设定条件去得到符合我们设定的条件的最佳的Location Provider。
比如我们用一个按钮来做这样的测试,其监听器实现如下:
private class BestProviderButtonListener implements OnClickListener{ @Override public void onClick(View v){ // 生成一个Criteria对象 Criteria criteria = new Criteria(); // 设置查询条件 criteria.setAccuracy(Criteria.ACCURACY_FINE); // 设置准确而非粗糙的精度 criteria.setPowerRequirement(Criteria.POWER_LOW); // 设置相对省电而非耗电,一般高耗电量会换来更精确的位置信息 criteria.setAltitudeRequired(false); // 不需要提供海拔信息 criteria.setSpeedRequired(false); // 不需要速度信息 criteria.setCostAllowed(false); // 不能产生费用 // 第一个参数,传递criteria对象 // 第二个参数,若为false,在所有Provider中寻找,不管该Provider是否处于可用状态,均使用该Provider。 // 若为true,则在所有可用的Provider中寻找。比如GPS处于禁用状态,则忽略GPS Provider。 String provider = locationManager.getBestProvider(criteria,false); System.out.println("Best provider-->"+provider); } }
那么怎么追踪设备位置呢?
我们可以使用void
android.location.LocationManager.requestLocationUpdates(String
provider,long minTime,float minDistance,LocationListener
listener)
我们说过,minTime是两次更新设置位置的最短时间,minDistance是两次更新设置位置的最小距离。
比如,先创建一个LocationManager对象,然后调用
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,5000,5000,new
TestLocationListener());
则表示最少5000毫秒,或是设备位移大于等于5000米时才会更新位置。