当前位置:首页 > Android > 正文内容

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

jsc9年前 (2016-04-06)Android3515
用户定位

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米时才会更新位置。


扫描二维码推送至手机访问。

版权声明:本文由微小站发布,如需转载请注明出处。

本文链接:https://jsc0.com/post/71.html

标签: Location
分享给朋友:

“Android学习笔记--用户定位User Location ” 的相关文章

使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。

使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。

在工作中又很多需求都不是android系统自带的控件可以达到效果的,内置的TabHost就是,只能达到简单的效果 ,所以这个时候就要自定义控件来达到效果:这个效果就是: 使用自定义RadioButton和ViewPager实现TabHost带滑动的页卡效果。    &...

android异步任务详解 AsynTask

android异步任务详解 AsynTask

android提供了一套专门用于异步处理的类。即:AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。其实,AsynTask类就是对Thread类的一个封装,并且加入了一些新的方法。编程时,两者都可以实现同样的功能。本文后面将对AsynTask和Thread...

android json解析及简单例子

JSON的定义:       一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式...

ViewPager + HorizontalScrollView 实现可滚动的标签栏

ViewPager + HorizontalScrollView 实现可滚动的标签栏

这是一个可滑动的标签栏的自定义控件,参考此文章http://blog.csdn.net/fx_sky/article/details/8990573,我将主要的功能整合成一个类,配上2个特定的布局即可使用。 效果图:    主要布局文件:<?xml&nb...

修改keystore密码别名等

修改keystore密码别名等

之前在测试Eclipse ADT的Custom debug keystore自定义调试证书的时候,发过一篇关于调试证书规格的博文:Eclipse ADT的Custom debug keystore所需证书规格,提到过自定义调试证书的密码和alias命名以及alias密码都是...

Fragment保持状态切换

Fragment保持状态切换

在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常挂掉网上说使用replace切换会使被切换的Fragment给替换掉,从而被被切换的Fra...