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

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

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

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 ” 的相关文章

Android中AsyncTask的简单用法

Android中AsyncTask的简单用法

        在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好 的用户体验。但是在子线程中无法去操作主线程(UI 线...

Android Location在GPS中的应用(一)

Android Location在GPS中的应用(一)

新建AndroidProject,注意选择Google APIs:  打开AndroidManifest.xml,在其中加入GPS使用权限: <uses-permission android:name="android.permission.ACCESS_COARSE_LO...

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

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

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

【代码】android 调用系统视频录制并生成缩略图

package com.example.videocapture; import android.app.Activity; import android.content.Intent; import android.database.Cursor;...

Android权限问题整理

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

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google...