900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > android locationManager定位

android locationManager定位

时间:2018-06-19 12:43:16

相关推荐

android locationManager定位

Android定位功能(一)

废话不多说,直接开始说说与实现Android定位有关的API吧。

这些API都在android.location包下,一共有三个接口和八个类。它们配合使用即可实现定位功能。

三个接口:

GpsStatus.Listener:这是一个当GPS状态发生改变时,用来接收通知的接口。

GpsStatus.NmeaListener:这是一个用来从GPS里接收Nmea-0183(为海用电子设备制定的标准格式)信息的接口。

LocationListener:位置监听器,用于接收当位置信息发生改变时从LocationManager接收通知的接口。

八个类:

Address:描述地址的类,比如:北京天安门

Criteria:用于描述Location Provider标准的类,标准包括位置精度水平,电量消耗水平,是否获取海拔、方位信息,是否允许接收付费服务。

GeoCoder:用于处理地理位置的编码。

GpsSatellite:和GpsStatus联合使用,用于描述当前GPS卫星的状态。

GpsStatus:和GpsStatus.Listener联合使用,用于描述当前GPS卫星的状态。

Location:用于描述位置信息。

LocationManager:通过此类获取和调用系统位置服务

LocationProvider:用于描述Location Provider的抽象超类,一个LocationProvider应该能够周期性的报告当前设备的位置信息。

这里通过一个代码示例,演示一下如何实现定位。

首先,在AndroidManifest.xml清单文件里需要加入ACCESS_FINE_LOCATION权限

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

其次,实现代码如下:

1 package com.test;

2

3 import java.io.IOException;

4 import java.util.List;

5

6 import android.app.Activity;

7 import android.location.Address;

8 import android.location.Criteria;

9 import android.location.Geocoder;

10 import android.location.Location;

11 import android.location.LocationListener;

12 import android.location.LocationManager;

13 import android.os.Bundle;

14 import android.util.Log;

15 import android.widget.Toast;

16

17 publicclass MainActivity extends Activity {

18@Override

19 publicvoid onCreate(Bundle savedInstanceState) {

20 super.onCreate(savedInstanceState);

21 setContentView(R.layout.main);

22

23 //获取到LocationManager对象

24 LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

25 //创建一个Criteria对象

26 Criteria criteria =new Criteria();

27 //设置粗略精确度

28 criteria.setAccuracy(Criteria.ACCURACY_COARSE);

29 //设置是否需要返回海拔信息

30 criteria.setAltitudeRequired(false);

31 //设置是否需要返回方位信息

32 criteria.setBearingRequired(false);

33 //设置是否允许付费服务

34 criteria.setCostAllowed(true);

35 //设置电量消耗等级

36 criteria.setPowerRequirement(Criteria.POWER_HIGH);

37 //设置是否需要返回速度信息

38 criteria.setSpeedRequired(false);

39

40 //根据设置的Criteria对象,获取最符合此标准的provider对象

41 String currentProvider = locationManager.getBestProvider(criteria, true);

42 Log.d("Location", "currentProvider: "+ currentProvider);

43 //根据当前provider对象获取最后一次位置信息

44 Location currentLocation = locationManager.getLastKnownLocation(currentProvider);

45 //如果位置信息为null,则请求更新位置信息

46 if(currentLocation ==null){

47 locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener);

48 }

49 //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度

50 //每隔10秒获取一次位置信息

51 while(true){

52 currentLocation = locationManager.getLastKnownLocation(currentProvider);

53 if(currentLocation !=null){

54Log.d("Location", "Latitude: "+ currentLocation.getLatitude());

55Log.d("Location", "location: "+ currentLocation.getLongitude());

56 break;

57 }else{

58Log.d("Location", "Latitude: "+0);

59Log.d("Location", "location: "+0);

60 }

61 try {

62Thread.sleep(10000);

63 } catch (InterruptedException e) {

64 Log.e("Location", e.getMessage());

65 }

66 }

67

68 //解析地址并显示

69 Geocoder geoCoder =new Geocoder(this);

70 try {

71 int latitude = (int) currentLocation.getLatitude();

72 int longitude = (int) currentLocation.getLongitude();

73 List<Address> list = geoCoder.getFromLocation(latitude, longitude, 2);

74 for(int i=0; i<list.size(); i++){

75Address address = list.get(i);

76Toast.makeText(MainActivity.this, address.getCountryName() + address.getAdminArea() + address.getFeatureName(), Toast.LENGTH_LONG).show();

77 }

78 } catch (IOException e) {

79 Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show();

80 }

81

82}

83

84 //创建位置监听器

85 private LocationListener locationListener =new LocationListener(){

86 //位置发生改变时调用

87 @Override

88 publicvoid onLocationChanged(Location location) {

89 Log.d("Location", "onLocationChanged");

90 Log.d("Location", "onLocationChanged Latitude"+ location.getLatitude());

91 Log.d("Location", "onLocationChanged location"+ location.getLongitude());

92 }

93

94 //provider失效时调用

95 @Override

96 publicvoid onProviderDisabled(String provider) {

97 Log.d("Location", "onProviderDisabled");

98 }

99

100 //provider启用时调用

101 @Override

102 publicvoid onProviderEnabled(String provider) {

103 Log.d("Location", "onProviderEnabled");

104 }

105

106 //状态改变时调用

107 @Override

108 publicvoid onStatusChanged(String provider, int status, Bundle extras) {

109 Log.d("Location", "onStatusChanged");

110 }

111};

112 }

由于代码里的Criteria对象对位置精度要求并不高,所以一般会返回“network”作为provider,而基于network的定位往往会存在一定的位置偏差,这对于需要精确定位的应用程序来说,显然不合要求。这时,需要则需要用到基于GPS的定位方法了

Android定位功能(二)

z13866763345(0)(0)-2-14 11:50android,定位

在前文中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息。但是前文是基于Criteria定制了一个标准,通过getBestProvider()方法由Android系统自动获取最符合Criteria的LocationProvider,从而实现了定位功能。这样的做法能最大限度的保证定位功能的可实现性,但是却无法保证获取到的位置信息有最大的准确度。因为除了GPS外,其他定位方式都或多或少存在着位置偏移。

在实现GPS定位前,先了解一下GPS的部分特性:

1. GPS定位需要依靠3颗或3颗以上的卫星。

2. GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。

3. GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。

在Android系统中,实现GPS定位的思路应该是:

1. 获取GPS的Location Provider。

2. 讲此Provider传入到requestLocationUpdates()方法,让Android系统获知搜索位置方式。

3. 创建实现了GpsStatus.Listener接口的对象,重写onGpsStatusChanged()方法,向LocationManager添加次监听器,检测卫星状态。(可选步骤)

根据以上思路,仿照前文中的例子,可以很容易的得到以下实现代码:(此代码的实现前提是GPS功能模块处于打开状态)

1 publicclass MainActivity extends Activity {

2 private LocationManager locationManager;

3 private GpsStatus gpsstatus;

4@Override

5 publicvoid onCreate(Bundle savedInstanceState) {

6 super.onCreate(savedInstanceState);

7 setContentView(R.layout.main);

8

9 //获取到LocationManager对象

10 locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

11

12 //根据设置的Criteria对象,获取最符合此标准的provider对象

13 String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();

14

15 //根据当前provider对象获取最后一次位置信息

16 Location currentLocation = locationManager.getLastKnownLocation(currentProvider);

17 //如果位置信息为null,则请求更新位置信息

18 if(currentLocation ==null){

19 locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener);

20 }

21 //增加GPS状态监听器

22 locationManager.addGpsStatusListener(gpsListener);

23

24 //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度

25 //每隔10秒获取一次位置信息

26 while(true){

27 currentLocation = locationManager.getLastKnownLocation(currentProvider);

28 if(currentLocation !=null){

29Log.d("Location", "Latitude: "+ currentLocation.getLatitude());

30Log.d("Location", "location: "+ currentLocation.getLongitude());

31 break;

32 }else{

33Log.d("Location", "Latitude: "+0);

34Log.d("Location", "location: "+0);

35 }

36 try {

37Thread.sleep(10000);

38 } catch (InterruptedException e) {

39 Log.e("Location", e.getMessage());

40 }

41 }

42}

43

44 private GpsStatus.Listener gpsListener =new GpsStatus.Listener(){

45 //GPS状态发生变化时触发

46 @Override

47 publicvoid onGpsStatusChanged(int event) {

48 //获取当前状态

49 gpsstatus=locationManager.getGpsStatus(null);

50 switch(event){

51 //第一次定位时的事件

52 case GpsStatus.GPS_EVENT_FIRST_FIX:

53 break;

54 //开始定位的事件

55 case GpsStatus.GPS_EVENT_STARTED:

56 break;

57 //发送GPS卫星状态事件

58 case GpsStatus.GPS_EVENT_SATELLITE_STATUS:

59 Toast.makeText(MainActivity.this, "GPS_EVENT_SATELLITE_STATUS", Toast.LENGTH_SHORT).show();

60 Iterable<GpsSatellite> allSatellites = gpsstatus.getSatellites();

61 Iterator<GpsSatellite> it=allSatellites.iterator();

62 int count =0;

63 while(it.hasNext())

64 {

65count++;

66 }

67 Toast.makeText(MainActivity.this, "Satellite Count:"+ count, Toast.LENGTH_SHORT).show();

68 break;

69 //停止定位事件

70 case GpsStatus.GPS_EVENT_STOPPED:

71 Log.d("Location", "GPS_EVENT_STOPPED");

72 break;

73 }

74 }

75};

76

77

78 //创建位置监听器

79 private LocationListener locationListener =new LocationListener(){

80 //位置发生改变时调用

81 @Override

82 publicvoid onLocationChanged(Location location) {

83 Log.d("Location", "onLocationChanged");

84 }

85

86 //provider失效时调用

87 @Override

88 publicvoid onProviderDisabled(String provider) {

89 Log.d("Location", "onProviderDisabled");

90 }

91

92 //provider启用时调用

93 @Override

94 publicvoid onProviderEnabled(String provider) {

95 Log.d("Location", "onProviderEnabled");

96 }

97

98 //状态改变时调用

99 @Override

100 publicvoid onStatusChanged(String provider, int status, Bundle extras) {

101 Log.d("Location", "onStatusChanged");

102 }

103};

104 }

通过以上代码中的注释部分,可以清晰的知道Android定位功能里相关方法的具体含义。希望对大家有用。

另外,因为GPS的自身特性,此代码在室内几乎无法定位,所以建议再真正的实际项目里,至少使用network和GPS两种不同的Location Provider实现定位功能。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。