在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息。但是前文是基于Criteria定制了一个标准,通过getBestProvider()方法由Android系统自动获取最符合Criteria的LocationProvider,从而实现了定位功能。这样的做法能最大限度的保证定位功能的可实现性,但是却无法保证获取到的位置信息有最大的准确度。因为除了GPS外,其他定位方式都或多或少存在着位置偏移。
在实现GPS定位前,先了解一下GPS的部分特性:
1:GPS定位需要依靠3颗或以上的卫星。
2:GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。
3:GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。
在Android系统中,实现GPS定位的思路大致是:
1、获取GPS的Location Provider。
2、将此Provider传入到requestLocationUpdates()方法,让Android系统获知搜索位置方式。
3、创建实现了GpsStatus.Listener接口的对象,重写onGpsStatusChanged()方法,向LocationManager添加次监听器,检测卫星状态。(可选步骤)
根据以上思路,仿照Android定位功能(一)中的例子,可以很容易的得到以下实现代码:(此代码的实现前提是GPS功能模块处于打开状态)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
public class MainActivity extends Activity private LocationManager private GpsStatus @Override public void onCreate(Bundle super .onCreate(savedInstanceState); setContentView(R.layout.main); // locationManager // String LocationManager.GPS_PROVIDER).getName(); // Location .getLastKnownLocation(currentProvider); // if (currentLocation null ) locationManager.requestLocationUpdates(currentProvider, 0 , 0 , locationListener); } // locationManager.addGpsStatusListener(gpsListener); // // while ( true ) currentLocation .getLastKnownLocation(currentProvider); if (currentLocation null ) Log.d( "Location" , "Latitude: + Log.d( "Location" , "location: + break ; } else { Log.d( "Location" , "Latitude: + 0 ); Log.d( "Location" , "location: + 0 ); } try { Thread.sleep( 10000 ); } catch (InterruptedException Log.e( "Location" , } } } private GpsStatus.Listener new GpsStatus.Listener() // @Override public void onGpsStatusChanged( int event) // gpsstatus null ); switch (event) // case GpsStatus.GPS_EVENT_FIRST_FIX: break ; // case GpsStatus.GPS_EVENT_STARTED: break ; // case GpsStatus.GPS_EVENT_SATELLITE_STATUS: Toast.makeText(MainActivity. this , "GPS_EVENT_SATELLITE_STATUS" , Toast.LENGTH_SHORT).show(); Iterable<GpsSatellite> .getSatellites(); Iterator<GpsSatellite> int count 0 ; while (it.hasNext()) count++; } Toast.makeText(MainActivity. this , "Satellite + Toast.LENGTH_SHORT).show(); break ; // case GpsStatus.GPS_EVENT_STOPPED: Log.d( "Location" , "GPS_EVENT_STOPPED" ); break ; } } }; // private LocationListener new LocationListener() // @Override public void onLocationChanged(Location Log.d( "Location" , "onLocationChanged" ); } // @Override public void onProviderDisabled(String Log.d( "Location" , "onProviderDisabled" ); } // @Override public void onProviderEnabled(String Log.d( "Location" , "onProviderEnabled" ); } // @Override public void onStatusChanged(String int status, Log.d( "Location" , "onStatusChanged" ); } }; } |
通过以上代码中的注释部分,可以清晰的知道Android定位功能里相关方法的具体含义。希望对大家有用。
另外,因为GPS的自身特性,此代码在室内几乎无法定位,所以建议再真正的实际项目里,至少使用network和GPS两种不同的Location Provider实现定位功能。
本人暂时未找到同时关闭网络和GPS功能实现定位的方法,本人也未找到通过代码在没有ROOT的前提下直接代开网络和GPS功能的代码。如果大家在这两方面有自己的体会,请不吝赐教,留言评论或给出参考地址都可。大家一同探讨,一同进步。