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

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

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

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的以上四个方法:
Java
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
  }
}


下面假设我们以一个按钮来触发事件:
Java
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>。
Java
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。


比如我们用一个按钮来做这样的测试,其监听器实现如下:
Java
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 ” 的相关文章

Android权限问题整理

Android权限系统非常庞大,我们在Android系统中做任何操作都需要首先获取Android系统权限,本文记录了所有的Android权限问题,整理一下分享给大家。访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES读取或写入登记check-in数...

android json解析及简单例子

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

实现应用程序只有在第一次启动时显示引导界面

第一次安装启动:启动页--->导航页-->主页面之后启动:启动页-->主页面实现的原理就是:在启动页面用做一个文件保存的状态,保存程序是不是第一次启动的状态。因为只是要保存一个状态,我们将这个程序是第一次打开就将他设为true,当他进入 主页面之后将他的状态未为false,因为都...

Android 学习之 开源项目PullToRefresh的使用

Android 学习之 开源项目PullToRefresh的使用

首先 下载 Android-PullToRefresh-master 下载地址  https://github.com/chrisbanes/Android-PullToRefresh 下载之...

onTextChanged参数解释及实现EditText字数监听

由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher。它有三个成员方法,第一个after很简单,这个方法就是在EditText内容已经改变之后调用,重点看下面两个方法:beforeTextChanged(CharSequ...

采用SharedPreferences保存用户偏好设置参数

采用SharedPreferences保存用户偏好设置参数-------------------------------------------------1.eclipse就是通过xml来保存用户的偏好设置-->window-->perfences-------------------...