首页 > Android > 正文

Android学习笔记--用户定位User Location

2016-04-06 Android 500 ℃ 0 评论
用户定位

User Location的作用:
1.获取用户的位置
2.追踪用户的移动


User Location的关键API
1.Location Manager:用于管理Android的用户定位服务
2.Location Providers:提供多种定位方式供开发者选择。
  <1>GPS Provider
  <2>Network Provider


定位方式的分类:
1.GPS定位:使用GPS卫星进行定位,需要在AndroidManifest.xml当中声明如下权限:
    android.permission.ACCESS_FINE_LOCATION

2.NETWORK定位:使用信号接收塔和WIFI接入点进行定位,需要在AndroidManifest.xml当中声明如下权限:
    android.permission.ACCESS_FINE_LOCATION
 
    android.permission.ACCESS_COARSE_LOCATION


获取用户的当前位置:
1.在AndroidManifest.xml当中声明相应的权限;
2.获取LocationManager对象;
3.选择LocationProvider;
4.绑定LocationListener对象。


LocationListener有四个方法:
1.onLocationChanged(Location location):当设备的位置发生改变时调用
    我们可以调用location.getLongitude()和location.getLatitude()来得到设备所处的经度和纬度
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。
查询条件:

78c913e3g777db26b10e3&690.png

我们创建一个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米时才会更新位置。


猜你喜欢

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

请填写验证码
日历
«   2018年10月   »
1234567
891011121314
15161718192021
22232425262728
293031
网站分类
最近发表
标签列表
站点信息
  • 文章总数:153
  • 页面总数:1
  • 分类总数:11
  • 标签总数:171
  • 评论总数:4
  • 浏览总数:94719