Android开发--用户定位服务--UserLocation

2013-01-28 08:32:26     我来说两句      作者:BruceZhang

收藏    我要投稿

[java]

<span style="background-color: rgb(243, 248, 251); font-family: simsun;">用户定位介绍:</span>

User Location的作用:

1.获取用户的位置

2.追踪用户的移动

User Location的关键API

1.Location Manager:用于管理Android的用户定位服务

2.Location Providers:提供多种定位方式供开发者选择。

<1>GPS Provider

<2>Network Provider

<3>Passive

定位方式的分类:

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

以上两种定位方式的区别是GPS定位精度更高,但同时也更耗电

获取用户的当前位置:

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]

<span style="font-size:18px;">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

}

}</span>

测试当前设备的LocationProvider

由于一般的设备存在不止一种定位方法,所以在这里给出查找定位服务的方法:

[java]

<span style="font-size:18px;">List<String> providers=locationManager.getAllProviders();

for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){

String string=(String)iterator.next();

Log.d("BruceZhang", string+"\n");</span>

由于有多个Provider,那么就需要做出选择,在这里给出选择最好的Provider的方法:

此时需要用到一个类--Criteria

下面是在Android SDK文档上给出的解释:

A class indicating the application criteria for selecting a location provider. Providers maybe ordered according to accuracy, power usage, ability to report altitude, speed, and bearing, and monetary cost.

它提供了一系列的方法,设置用户的需求,并最终给出用户所需要的最佳的Provider,下面是文档上对设置条件的解释:

[java] view plaincopy

<span style="font-size:18px;">void   setAccuracy(int accuracy)

Indicates the desired accuracy for latitude and longitude.</span>

[java]

<span style="font-size:18px;">

void     setAltitudeRequired(boolean altitudeRequired)

Indicates whether the provider must provide altitude information.</span>

[java]

<span style="font-size:18px;">

void     setBearingAccuracy(int accuracy)

Indicates the desired bearing accuracy.</span>

[java

<span style="font-size:18px;">

void     setBearingRequired(boolean bearingRequired)

Indicates whether the provider must provide bearing information.</span>

[java]

<span style="font-size:18px;">

void     setCostAllowed(boolean costAllowed)

Indicates whether the provider is allowed to incur monetary cost.</span>

[java]

<span style="font-size:18px;">

void     setHorizontalAccuracy(int accuracy)

Indicates the desired horizontal accuracy (latitude and longitude).</span>

[java]

<span style="font-size:18px;">

void     setPowerRequirement(int level)

Indicates the desired maximum power level.</span>

[java]

<span style="font-size:18px;">

void     setSpeedAccuracy(int accuracy)

Indicates the desired speed accuracy.</span>

[java] view plaincopy

<span style="font-size:18px;">

void     setSpeedRequired(boolean speedRequired)

Indicates whether the provider must provide speed information.</span>

[java] view plaincopy

<span style="font-size:18px;">

void     setVerticalAccuracy(int accuracy)

Indicates the desired vertical accuracy (altitude).</span>

追踪用户的位置:

对用户的位置进行更新用到的方法和解释如下:

[java]

//          public void requestLocationUpdates (String provider,

//          long minTime, float minDistance, LocationListener listener)

//          Added in API level 1

//          Register for location updates using the named provider, and a pending intent.

//

//          Parameters

//          provider  the name of the provider with which to register

//          minTime  minimum time interval between location updates, in milliseconds

//          minDistance  minimum distance between location updates, in meters

//          listener  a LocationListener whose onLocationChanged(Location) method will be called for each location update

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,

0, new TestLocationListener());

下面,给出一个例子,实现用户的定位,取得支持的LocationProvider,根据条件获取最佳的Provider:

一下是实现的源代码:

[java]

public class MainActivity extends Activity {

private Button button;

private Button button2;

private Button button3;

private Button button4;

private LocationManager locationManager;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button=(Button)findViewById(R.id.button1);

button2=(Button)findViewById(R.id.button2);

button3=(Button)findViewById(R.id.button3);

button4=(Button)findViewById(R.id.button4);

button.setOnClickListener(new ButtonListener());

button2.setOnClickListener(new ProviderButtonListener());

button3.setOnClickListener(new BestProviderButtonListener());

button4.setOnClickListener(new MyLocation());

locationManager=(LocationManager)MainActivity.this.

getSystemService(Context.LOCATION_SERVICE);

}

private class ButtonListener implements OnClickListener{

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

//          LocationManager locationManager=(LocationManager)MainActivity.this.

//                  getSystemService(Context.LOCATION_SERVICE);

/*

* 各个参数的意义:

* 1.定义当前所使用的Location Provider

* 2.位置更新一次的最小时间间隔

* 3.位置更新的最小距离

* 4.绑定监听器--位置发生变化会调用其中的方法

*/

Log.d("BruceZhang", "Bond Success");

//          public void requestLocationUpdates (String provider,

//          long minTime, float minDistance, LocationListener listener)

//          Added in API level 1

//          Register for location updates using the named provider, and a pending intent.

//

//          Parameters

//          provider  the name of the provider with which to register

//          minTime  minimum time interval between location updates, in milliseconds

//          minDistance  minimum distance between location updates, in meters

//          listener  a LocationListener whose onLocationChanged(Location) method will be called for each location update

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,

0, new TestLocationListener());

}

}

private class ProviderButtonListener implements OnClickListener{

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

List<String> providers=locationManager.getAllProviders();

for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){

String string=(String)iterator.next();

Log.d("BruceZhang", string+"\n");

}

}

}

private class BestProviderButtonListener implements OnClickListener{

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Criteria criteria=new Criteria();

criteria.setAccuracy(Criteria.ACCURACY_FINE);

criteria.setPowerRequirement(Criteria.POWER_LOW);

criteria.setAltitudeRequired(false);

criteria.setSpeedRequired(false);

criteria.setCostAllowed(false);

//第二个参数设置为false时,不管当前的那个provider是否可用,都需要进行查找,并根据条件设为最优

String provider=locationManager.getBestProvider(criteria, false);

Log.d("BruceZhang", "The best provider is:"+provider);

}

}

private class MyLocation implements OnClickListener{

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

//对用用户定位服务主要是中间两个参数的设置

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000,

2000, new TestLocationListener());

}

}

private class TestLocationListener implements LocationListener{

//这个函数的参数是用户当前的位置

@Override

public void onLocationChanged(Location arg0) {

// TODO Auto-generated method stub

//          Toast.makeText(MainActivity.this, "您当前的经度是:"+arg0.getLongitude()+" ,"+

//          "您当前的纬度是:"+arg0.getLatitude(),

//                  Toast.LENGTH_SHORT).show();

Log.d("BruceZhang", arg0.getLongitude()+"");

Log.d("BruceZhang", arg0.getLatitude()+"");

}

@Override

public void onProviderDisabled(String arg0) {

// TODO Auto-generated method stub

}

@Override

public void onProviderEnabled(String arg0) {

// TODO Auto-generated method stub

}

@Override  www.2cto.com

public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

// TODO Auto-generated method stub

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}

}

Android开发--用户定位服务--UserLocation的更多相关文章

  1. Android开发-API指南-服务

    Service 英文原文:http://developer.android.com/guide/components/services.html 采集(更新)日期:2014-12-23 原博客:htt ...

  2. [android学习]android_gps定位服务简单实现

    前言 gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在照着案列敲了两遍之后,发现老师的案例是在是太老了,并且直接 ...

  3. Android开发——用户在屏幕上的手势识别

    个定点决定.四个属性分别为left(1),top(2),right(3),bottom(4). 数字为图上标出的距离.显然这四个属性是相对于父容器来定的,均可以通过get()方法获取. 因此很容易得出 ...

  4. Android开发学习—— Service 服务

    Service运行于后台的一个组件,用来运行适合运行在后台的代码,服务是没有前台界面,可以视为没有界面的activity. 服务可以被手动关闭,不会重启,但是如果被自动关闭,内存充足就会重启. sta ...

  5. android开发——用户头像

    最近,小灵狐得知了一种能够加快修炼速度的绝世秘法,那便是修炼android神功.小灵狐打算用android神功做一个app,今天他的修炼内容就是头像功能.可是小灵狐是个android小白啊,所以修炼过 ...

  6. Android开发——GPS定位

    1.LocationManager LocationManager系统服务是位置服务的核心组件,它提供了一系列方法来处理与位置相关的问题. 与LocationManager相关的两个知识点: 1.1 ...

  7. IOS 定位服务与地图的应用开发

    1.定位服务 现在的移动设备很多都提供定位服务,IOS设备提供3种不同定位途径: (1)WiFi定位,通过查询一个WiFi路由器的地理位置的信息,比较省电:IPhone,IPod touch和IPad ...

  8. iOS开发拓展篇—CoreLocation定位服务

    iOS开发拓展篇—CoreLocation定位服务 一.简单说明 1.CLLocationManager CLLocationManager的常用操作和属性 开始用户定位- (void)startUp ...

  9. Android网络定位服务定制简述

    Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...

随机推荐

  1. 启动Tomcat报错 “A child container failed during start”

    严重: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalin ...

  2. CF1020B Badge 【模拟链表】

    n个点(n<=1000) 接下来n个整数表示ai 第i个数ai表示i到ai有一条边 输出: n个数 表示从第i个点出发,最先被访问两次的点 样例1: 从1 出发,先到达2,2会到达3,3又到达2 ...

  3. 最简单的Web Service实现

    概述 这里提供一个最简单的Web Service的实现,基于JAX-WS.除了jdk不需要任何其他jar包,使用Eclipse提供的Web Services Explorer访问服务. 服务端的实现 ...

  4. Mindjet Mindmanager复制文件打不开

    概述 使用Mindjet软件画思维导图,保存后得到一个后缀为mmap的文件.复制到一个新的位置,却发现新的文件打不开,导致Mindjet崩溃.这里提供一个解决方案. 解决方案 复制的文件打不开 先打开 ...

  5. maven "Generating project in Batch mode"问题的解决

    在maven的五分钟入门里面,有这样一个命令: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Darc ...

  6. 【Tempest】openstack自动化测试组件tempest及自动化测试工具nose

    宝宝心里苦,但是宝宝只能在这穷乡僻壤说,下周又要开组会必须得干点事了.这次是做论文中的实验部分,主要利用到了openstack中的自动化测试组件Tempest,具体原因不细说了. 安装 分两种安装方法 ...

  7. noip 2016 day1 T1玩具谜题

    题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉 ...

  8. AGC 012 C - Tautonym Puzzle

    题面在这里! 神仙构造啊qwqwq. 窝一开始只想到一个字符串长度是 O(log(N)^2) 的做法:可以发现一段相同的长度为n的字符串的贡献是 2^(n-1)-1 ,可以把它看成类二进制,枚举用了多 ...

  9. 【模拟退火】poj1379 Run Away

    题意:平面上找一个点,使得其到给定的n个点的距离的最小值最大. 模拟退火看这篇:http://www.cnblogs.com/autsky-jadek/p/7524208.html 这题稍有不同之处仅 ...

  10. 【主席树】Gym - 101237A - MEX-Query

    主席树里每个值的位置存当前该值出现的最右位置. 如果root[r]的前缀主席树中,某值最右位置大于等于l,说明该值出现在了l,r中. 所以主席树维护区间最小值,如果左半值域的最小值<l,则说明左 ...