Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息



1.位置服务,英文翻译为Location-Based Services,简称LBS,又称为定位服务或基于位置的服务,融合了GPS定位、移动通信、导航等多种技术,提供与空间位置相关的综合应用服务,基于位置的服务发展很迅速,涉及商务、医疗、工作和生活的各个方面,为用户提供定位、追踪和敏感区域警告等一系列服务。比如谷歌地图,百度地图,都需要通过位置服务。

 

2.Android平台下支持提供位置服务的API,在开发过程中主要用到LocationManager和LocationProviders对象:

(1).LocationManager可以用来获取当前的位置,追踪设备的移动路线,或设定敏感区域,在进入或离开敏感区域时设备会发出特定警报 。

(2).LocationProviders则是提供定位功能的组件集合,集合中的每种组件以不同的技术提供设备的当前位置,区别在于定位的精度、速度和成本等方面 。

 

3.接下来将讲述一个如何实现获取位置的经纬度,并且如果位置改变,如何通过位置的改变,经纬度也发生变化的例子,这里以LocationManager对象为例:

(1).首先,第一步,获取LocationManager对象,可以通过调用android.app.Activity.getSystemService()函数获取,代码如下:

?
1
2
String serviceString = Context.LOCATION_SERVICE; // 获取的是位置服务
LocationManager locationManager = (LocationManager) getSystemService(serviceString); // 调用getSystemService()方法来获取LocationManager对象

其中的LOCATION_SERVICE是Android支持的系统级服务,控制位置等设备的更新。

 

(2).在获取到LocationManager对象后,还需要指定LocationManager的定位方法 ,然后才能够调用LocationManager.getLastKnowLocation()方法获取当前位置 ,目前LocationManager主要有两种定位方法

GPS定位:可以提供更加精确的位置信息,但定位速度和质量受到卫星数量和环境情况的影响,需要android.permissions.ACCESS_FINE_LOCATION用户权限。

网络定位:提供的位置信息精度差,但速度较GPS定位要迅速 ,利用基站或WiFi访问的提供近似的位置信息,需要具有如下权限:android.permission.ACCESS_COARSE_LOCATION 或 android.permission.ACCESS_FINE_LOCATION。

注:(使用GPS定位和网络定位的LocationManager类的静态常量不一样,GPS定位的LocationManager类的静态常量为:GPS_PROVIDER,网络定位的LocationManager类的静态常量为:NETWORK_PROVIDER,这两个静态常量在获取当前位置时要用到。)

下面以使用GPS定位为例,获取位置信息代码如下:

?
1
2
String provider = LocationManager.GPS_PROVIDER; // 指定LocationManager的定位方法
Location location = locationManager.getLastKnownLocation(provider); // 调用getLastKnownLocation()方法获取当前的位置信息

 

(3).通过调用Location中的getLatitude()和getLonggitude()方法可以分别获取位置信息中的纬度和经度,代码如下:

?
1
2
double lat = location.getLatitude(); //获取纬度
double lng = location.getLongitude(); //获取经度

 

(4).在很多提供定位服务的应用程序中,不仅需要获取当前的位置信息,还需要监视位置的变化,在位置改变时调用特定的处理方法 ,其中LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),可以根据位置的距离变化和时间间隔设定,产生位置改变事件的条件,这样可以避免因微小的距离变化而产生大量的位置改变事件 ,LocationManager中设定监听位置变化的代码如下:

?
1
locationManager.requestLocationUpdates(provider, 2000 , 10 ,locationListener); // 产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒,设定监听位置变化

接下来介绍上面这行代码的各个参数,第一个参数是我们之前指定LocationManager的定位方法,GPS定位或网络定位,第二个参数指的是产生位置改变事件的时间间隔,单位为微秒,第三个参数指的是距离条件,单位为米,第四个参数是回调函数,用于处理位置改变事件,即设置LocationListener监听器。总的来说,那一行代码将产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒。

 

(5).实现locationListener的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private final LocationListener locationListener = new LocationListener() {
 
         @Override
         public void onLocationChanged(Location location) {
             // TODO Auto-generated method stub
             
         }
 
         @Override
         public void onProviderDisabled(String arg0) {
             // TODO Auto-generated method stub
             
         }
 
         @Override
         public void onProviderEnabled(String arg0) {
             // TODO Auto-generated method stub
             
         }
 
         @Override
         public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
             // TODO Auto-generated method stub
 
         }
 
     };


接下来对上面实现LocationListener的代码下的四个方法进行简单介绍:

onLocationChanged()这个方法在位置改变时被调用,onProviderDisabled()这个方法在用户禁用具有定位功能的硬件时被调用,onProviderEnabled()这个方法在用户启用具有定位功能的硬件时被调用,onStatusChanged()这个方法在定位功能硬件状态改变时被调用,例如,从不可获取位置信息状态到可以获取位置信息的状态,反之亦然 。

 

(6).为了使GPS定位功能生效,还需要在AndroidManifest.xml文件中加入用户许可,即加入下面这行代码,加入用户权限:

?
1
<uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" ></uses-permission>

 

4.接下来附上完整代码,首先新建一个Android项目,项目名称为LocationManagerTest,新建完成后:

(1).打开activity_main.xml文件,进行布局,布局代码如下:

 

?
1
2
3
4
5
6
<linearlayout android:layout_height= "match_parent" android:layout_width= "match_parent" android:orientation= "vertical" xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" >
 
     
     <textview android:id= "@+id/location" android:layout_height= "wrap_content" android:layout_width= "match_parent" >
     
</textview></linearlayout>

 

 

(2).接下来打开MainActivity.java文件,通过LocationManager对象来获取当前位置,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package xg.locationmanagertest;
 
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
 
public class MainActivity extends Activity {
     
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         String serviceString = Context.LOCATION_SERVICE; // 获取的是位置服务
         LocationManager locationManager = (LocationManager) getSystemService(serviceString); // 调用getSystemService()方法来获取LocationManager
         String provider = LocationManager.GPS_PROVIDER; // 指定LocationManager的定位方法
         Location location = locationManager.getLastKnownLocation(provider); // 调用getLastKnownLocation()方法获取当前的位置信息
         getLocationInfo(location); // 获得经度和纬度的方法
         locationManager.requestLocationUpdates(provider, 2000 , 10 ,
                 locationListener); // 产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒,设定监听位置变化
 
     }
 
     private void getLocationInfo(Location location) {
         String latLongInfo;
         TextView locationText = (TextView) findViewById(R.id.location); //获取到布局文件里的TextView组件
 
         if (location != null ) {
             double lat = location.getLatitude(); //获取纬度
             double lng = location.getLongitude(); //获取经度
             latLongInfo = "纬度为: " + lat + "\n经度为: " + lng;
         } else {
             latLongInfo = "没有发现到当前位置" ;
         }
         locationText.setText( "你当前的位置是:\n" + latLongInfo); //为TextView文本视图赋值
     }
 
     /*
      * LocationListener监听器
      * 当位置发生改变时,会将最新的位置信息显示在界面上
      */
     private final LocationListener locationListener = new LocationListener() {
 
         @Override
         public void onLocationChanged(Location location) {
             // TODO Auto-generated method stub
             getLocationInfo(location);
         }
 
         @Override
         public void onProviderDisabled(String arg0) {
             // TODO Auto-generated method stub
             getLocationInfo( null );
         }
 
         @Override
         public void onProviderEnabled(String arg0) {
             // TODO Auto-generated method stub
             getLocationInfo( null );
         }
 
         @Override
         public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
             // TODO Auto-generated method stub
 
         }
 
     };
}



(3).接下来再AndroidManifest.xml文件中加入用户权限,代码便完成了,AndroidManifest.xml文件代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--?xml version= "1.0" encoding= "utf-8" ?-->
<manifest android:versioncode= "1" android:versionname= "1.0" package = "xg.locationmanagertest" xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <uses-sdk android:minsdkversion= "8" android:targetsdkversion= "19" >
     <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" >
 
     
         
             <intent-filter>
                 
 
                 <category android:name= "android.intent.category.LAUNCHER" >
             </category></action></intent-filter>
         </activity>
     </application>
 
</uses-permission></uses-sdk></manifest>

这样即完成了代码,就可以显示当前位置信息,并能够监视设备的位置变化 。

 

(4).位置服务一般都需要使用设备上的硬件,最理想的调试方式是将程序上传到物理设备上运行,但在没有物理设备的情况下,也可以使用Android模拟器提供的虚拟方式模拟设备的位置变化,调试具有位置服务的应用程序,这个Android模拟器提供的虚拟方式设备在哪里呢?

在Window菜单栏下的Show View菜单下,选择子菜单other,弹出下图,选择打开下图红色箭头指向处即可打开来:

\

打开DDMS中的模拟器控制,开启Android模拟器后,在Location Controls中的Longitude和Latitude部分输入设备当前的经度和纬度,然后点击Send按钮,就将虚拟的位置信息发送到Android模拟器中,如下图所示 :

\



 

运行这个项目之后,点击上图的send按钮,发送经纬度到Android模拟器上,效果如下:

\

 

如果我们把经纬度改了,改成下图的数据,点击send按钮:

\


然后会发现该项目里面的经纬度变了,变成我们设备上输入的0和0了,如下图所示:

\
 

 

5.以上内容仅供大家爱学习参考,这个也是我通教材上的PPT里面学的,希望对大家有用,谢谢!

1.位置服务,英文翻译为Location-Based Services,简称LBS,又称为定位服务或基于位置的服务,融合了GPS定位、移动通信、导航等多种技术,提供与空间位置相关的综合应用服务,基于位置的服务发展很迅速,涉及商务、医疗、工作和生活的各个方面,为用户提供定位、追踪和敏感区域警告等一系列服务。比如谷歌地图,百度地图,都需要通过位置服务。

 

2.Android平台下支持提供位置服务的API,在开发过程中主要用到LocationManager和LocationProviders对象:

(1).LocationManager可以用来获取当前的位置,追踪设备的移动路线,或设定敏感区域,在进入或离开敏感区域时设备会发出特定警报 。

(2).LocationProviders则是提供定位功能的组件集合,集合中的每种组件以不同的技术提供设备的当前位置,区别在于定位的精度、速度和成本等方面 。

 

3.接下来将讲述一个如何实现获取位置的经纬度,并且如果位置改变,如何通过位置的改变,经纬度也发生变化的例子,这里以LocationManager对象为例:

(1).首先,第一步,获取LocationManager对象,可以通过调用android.app.Activity.getSystemService()函数获取,代码如下:

?
1
2
String serviceString = Context.LOCATION_SERVICE; // 获取的是位置服务
LocationManager locationManager = (LocationManager) getSystemService(serviceString); // 调用getSystemService()方法来获取LocationManager对象

其中的LOCATION_SERVICE是Android支持的系统级服务,控制位置等设备的更新。

 

(2).在获取到LocationManager对象后,还需要指定LocationManager的定位方法 ,然后才能够调用LocationManager.getLastKnowLocation()方法获取当前位置 ,目前LocationManager主要有两种定位方法

GPS定位:可以提供更加精确的位置信息,但定位速度和质量受到卫星数量和环境情况的影响,需要android.permissions.ACCESS_FINE_LOCATION用户权限。

网络定位:提供的位置信息精度差,但速度较GPS定位要迅速 ,利用基站或WiFi访问的提供近似的位置信息,需要具有如下权限:android.permission.ACCESS_COARSE_LOCATION 或 android.permission.ACCESS_FINE_LOCATION。

注:(使用GPS定位和网络定位的LocationManager类的静态常量不一样,GPS定位的LocationManager类的静态常量为:GPS_PROVIDER,网络定位的LocationManager类的静态常量为:NETWORK_PROVIDER,这两个静态常量在获取当前位置时要用到。)

下面以使用GPS定位为例,获取位置信息代码如下:

?
1
2
String provider = LocationManager.GPS_PROVIDER; // 指定LocationManager的定位方法
Location location = locationManager.getLastKnownLocation(provider); // 调用getLastKnownLocation()方法获取当前的位置信息

 

(3).通过调用Location中的getLatitude()和getLonggitude()方法可以分别获取位置信息中的纬度和经度,代码如下:

?
1
2
double lat = location.getLatitude(); //获取纬度
double lng = location.getLongitude(); //获取经度

 

(4).在很多提供定位服务的应用程序中,不仅需要获取当前的位置信息,还需要监视位置的变化,在位置改变时调用特定的处理方法 ,其中LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),可以根据位置的距离变化和时间间隔设定,产生位置改变事件的条件,这样可以避免因微小的距离变化而产生大量的位置改变事件 ,LocationManager中设定监听位置变化的代码如下:

?
1
locationManager.requestLocationUpdates(provider, 2000 , 10 ,locationListener); // 产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒,设定监听位置变化

接下来介绍上面这行代码的各个参数,第一个参数是我们之前指定LocationManager的定位方法,GPS定位或网络定位,第二个参数指的是产生位置改变事件的时间间隔,单位为微秒,第三个参数指的是距离条件,单位为米,第四个参数是回调函数,用于处理位置改变事件,即设置LocationListener监听器。总的来说,那一行代码将产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒。

 

(5).实现locationListener的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private final LocationListener locationListener = new LocationListener() {
 
         @Override
         public void onLocationChanged(Location location) {
             // TODO Auto-generated method stub
             
         }
 
         @Override
         public void onProviderDisabled(String arg0) {
             // TODO Auto-generated method stub
             
         }
 
         @Override
         public void onProviderEnabled(String arg0) {
             // TODO Auto-generated method stub
             
         }
 
         @Override
         public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
             // TODO Auto-generated method stub
 
         }
 
     };


接下来对上面实现LocationListener的代码下的四个方法进行简单介绍:

onLocationChanged()这个方法在位置改变时被调用,onProviderDisabled()这个方法在用户禁用具有定位功能的硬件时被调用,onProviderEnabled()这个方法在用户启用具有定位功能的硬件时被调用,onStatusChanged()这个方法在定位功能硬件状态改变时被调用,例如,从不可获取位置信息状态到可以获取位置信息的状态,反之亦然 。

 

(6).为了使GPS定位功能生效,还需要在AndroidManifest.xml文件中加入用户许可,即加入下面这行代码,加入用户权限:

?
1
<uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" ></uses-permission>

 

4.接下来附上完整代码,首先新建一个Android项目,项目名称为LocationManagerTest,新建完成后:

(1).打开activity_main.xml文件,进行布局,布局代码如下:

 

?
1
2
3
4
5
6
<linearlayout android:layout_height= "match_parent" android:layout_width= "match_parent" android:orientation= "vertical" xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" >
 
     
     <textview android:id= "@+id/location" android:layout_height= "wrap_content" android:layout_width= "match_parent" >
     
</textview></linearlayout>

 

 

(2).接下来打开MainActivity.java文件,通过LocationManager对象来获取当前位置,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package xg.locationmanagertest;
 
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
 
public class MainActivity extends Activity {
     
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         String serviceString = Context.LOCATION_SERVICE; // 获取的是位置服务
         LocationManager locationManager = (LocationManager) getSystemService(serviceString); // 调用getSystemService()方法来获取LocationManager
         String provider = LocationManager.GPS_PROVIDER; // 指定LocationManager的定位方法
         Location location = locationManager.getLastKnownLocation(provider); // 调用getLastKnownLocation()方法获取当前的位置信息
         getLocationInfo(location); // 获得经度和纬度的方法
         locationManager.requestLocationUpdates(provider, 2000 , 10 ,
                 locationListener); // 产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒,设定监听位置变化
 
     }
 
     private void getLocationInfo(Location location) {
         String latLongInfo;
         TextView locationText = (TextView) findViewById(R.id.location); //获取到布局文件里的TextView组件
 
         if (location != null ) {
             double lat = location.getLatitude(); //获取纬度
             double lng = location.getLongitude(); //获取经度
             latLongInfo = "纬度为: " + lat + "\n经度为: " + lng;
         } else {
             latLongInfo = "没有发现到当前位置" ;
         }
         locationText.setText( "你当前的位置是:\n" + latLongInfo); //为TextView文本视图赋值
     }
 
     /*
      * LocationListener监听器
      * 当位置发生改变时,会将最新的位置信息显示在界面上
      */
     private final LocationListener locationListener = new LocationListener() {
 
         @Override
         public void onLocationChanged(Location location) {
             // TODO Auto-generated method stub
             getLocationInfo(location);
         }
 
         @Override
         public void onProviderDisabled(String arg0) {
             // TODO Auto-generated method stub
             getLocationInfo( null );
         }
 
         @Override
         public void onProviderEnabled(String arg0) {
             // TODO Auto-generated method stub
             getLocationInfo( null );
         }
 
         @Override
         public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
             // TODO Auto-generated method stub
 
         }
 
     };
}



(3).接下来再AndroidManifest.xml文件中加入用户权限,代码便完成了,AndroidManifest.xml文件代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--?xml version= "1.0" encoding= "utf-8" ?-->
<manifest android:versioncode= "1" android:versionname= "1.0" package = "xg.locationmanagertest" xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <uses-sdk android:minsdkversion= "8" android:targetsdkversion= "19" >
     <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" >
 
     
         
             <intent-filter>
                 
 
                 <category android:name= "android.intent.category.LAUNCHER" >
             </category></action></intent-filter>
         </activity>
     </application>
 
</uses-permission></uses-sdk></manifest>

这样即完成了代码,就可以显示当前位置信息,并能够监视设备的位置变化 。

 

(4).位置服务一般都需要使用设备上的硬件,最理想的调试方式是将程序上传到物理设备上运行,但在没有物理设备的情况下,也可以使用Android模拟器提供的虚拟方式模拟设备的位置变化,调试具有位置服务的应用程序,这个Android模拟器提供的虚拟方式设备在哪里呢?

在Window菜单栏下的Show View菜单下,选择子菜单other,弹出下图,选择打开下图红色箭头指向处即可打开来:

\

打开DDMS中的模拟器控制,开启Android模拟器后,在Location Controls中的Longitude和Latitude部分输入设备当前的经度和纬度,然后点击Send按钮,就将虚拟的位置信息发送到Android模拟器中,如下图所示 :

\



 

运行这个项目之后,点击上图的send按钮,发送经纬度到Android模拟器上,效果如下:

\

 

如果我们把经纬度改了,改成下图的数据,点击send按钮:

\


然后会发现该项目里面的经纬度变了,变成我们设备上输入的0和0了,如下图所示:

\
 

 

5.以上内容仅供大家爱学习参考,这个也是我通教材上的PPT里面学的,希望对大家有用,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值