不说废话,直接说说实现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应该能够周期性的报告当前设备的位置信息。
这里通过一个示例代码来演示一下android定位。
首先,在AndroidManifest.xml清单文件里需要加入ACCESS_FINE_LOCATION权限:
1
|
< uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" ></ uses-permission > |
其次,实现代码如下:
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
111
112
113
114
115
116
117
118
119
|
package com.test; import java.io.IOException; import java.util.List; import android.app.Activity; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.widget.Toast; public class PositionActivity extends Activity @Override public void onCreate(Bundle super .onCreate(savedInstanceState); setContentView(R.layout.main); // LocationManager // Criteria new Criteria(); // criteria.setAccuracy(Criteria.ACCURACY_COARSE); // criteria.setAltitudeRequired( false ); // criteria.setBearingRequired( false ); // criteria.setCostAllowed( true ); // criteria.setPowerRequirement(Criteria.POWER_HIGH); // criteria.setSpeedRequired( false ); // String .getBestProvider(criteria, true ); Log.d( "Location" , "currentProvider: + // Location .getLastKnownLocation(currentProvider); // if (currentLocation null ) locationManager.requestLocationUpdates(currentProvider, 0 , 0 , locationListener); } // // 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" , } } // Geocoder new Geocoder( this ); try { int latitude int ) int longitude int ) List<Address> 2 ); for ( int i 0 ; Address Toast.makeText( PositionActivity. this , address.getCountryName() + .show(); } } catch (IOException Toast.makeText(PositionActivity. this , Toast.LENGTH_LONG).show(); } } // private LocationListener new LocationListener() // @Override public void onLocationChanged(Location Log.d( "Location" , "onLocationChanged" ); Log.d( "Location" , "onLocationChanged + 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" ); } }; } |
由于代码里的Criteria对象对位置精度要求并不高,所以一般会返回“network”作为provider,而基于network的定位往往会存在一定的位置偏差,这对于需要精确定位的应用程序来说,显然不合要求。这时,需要则需要用到基于GPS的定位方法了