Android GPS定位(wei)步驟
時間(jian):2018-09-20 來源:未知
為確定設備所在(zai)位置(zhi),需要(yao)進行以下步驟的操作。
提供位置服務,需要獲得LocationManager對象(xiang)。使用LOCATION_SERVICE參數調(diao)用android.app.Activity.getSystemService()函數獲取一(yi)個LocationManager實例(li)。
android.app.Activity.getSystemService()函(han)數代碼如(ru)代碼所示(shi)。
getSystemService()
//Context.LOCATION_SERVICE指明獲取的服務是位置服務
String serviceString = Context.LOCATION_SERVICE;
//根據服務名稱獲取Android提供的系統級服務
LocationManagerLocationManager =
(LocationManager)getSystemService(serviceString);
這里(li)介(jie)紹(shao)一下Android支(zhi)持的(de)系(xi)統級(ji)服務有哪些,如表所示。
Android支持(chi)的系(xi)統級服務表
| Context類的靜態常量 | 值 | 返回對象 | 說明 |
| LOCATION_SERVICE | location | LocationManager | 控制位置等設備的更新 |
| WINDOW_SERVICE | window | WindowManager | 頂層的窗口管理器 |
| LAYOUT_INFLATER_SERVICE | layout_inflater | LayoutInflater | 將XML資源實例化為View |
| POWER_SERVICE | power | PowerManager | 電源管理 |
| ALARM_SERVICE | alarm | AlarmManager | 在指定時間接受Intent |
| NOTIFICATION_SERVICE | notification | NotificationManager | 后臺事件通知 |
| KEYGUARD_SERVICE | keyguard | KeyguardManager | 鎖定或解鎖鍵盤 |
| SEARCH_SERVICE | search | SearchManager | 訪問系統的搜索服務 |
| VIBRATOR_SERVICE | vibrator | Vibrator | 訪問支持振動的硬件 |
| CONNECTIVITY_SERVICE | connection | ConnectivityManager | 網絡連接管理 |
| WIFI_SERVICE | wifi | WifiManager | WiFi連接管理 |
| INPUT_METHOD_SERVICE | input_method | InputMethodManager | 輸入法管理 |
選擇LocationManager的定(ding)(ding)位方法。在獲取到LocationManager后(hou),還需要指定(ding)(ding)LocationManager的定(ding)(ding)位方法,然后(hou)才能夠(gou)調用LocationManager,LocationManager支持的定(ding)(ding)位方法有(you)以(yi)下兩種。
GPS定位:可(ke)以提(ti)供更加精確的(de)位置(zhi)信息,但(dan)定位速度和質量受到(dao)衛(wei)星數(shu)量和環(huan)境情況(kuang)的(de)影響。
網絡定(ding)位:提(ti)供的位置信息精度差,但速度較GPS定(ding)位快。
LocationManager支持的定位方法比較,如(ru)表所示。
LocationManager支持(chi)的定位方(fang)法比較
| LocationManager類的靜態常量 | 值 | 說明 |
| GPS_PROVIDER |
gps
|
使用GPS定位,利用衛星提供精確的位置信息,需要android.permissions.ACCESS_FINE_LOCATION用戶權限 |
| NETWORK_PROVIDER | network |
使用網絡定位,利用基站或WiFi提供近似的位置信息,需要具有如下權限: android.permission.ACCESS_COARSE_LOCATION或android.permission.ACCESS_FINE_LOCATION. |
在指定(ding)LocationManager的定(ding)位(wei)(wei)方法后,則可以調用getLastKnowLocation()方法獲取(qu)當前的位(wei)(wei)置(zhi)信息(xi)。
以(yi)使用GPS定(ding)位為例,獲取位置(zhi)信息的代(dai)碼(ma)(ma)如(ru)代(dai)碼(ma)(ma)清單(dan)所示。
代碼清單(dan)GPS定位獲取位置信(xin)息
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
在(zai)上述代碼中(zhong),第(di)2行返回的(de)(de)Location對象中(zhong),包含(han)了可以確定位置的(de)(de)信息,如經(jing)度、緯(wei)度和速度等。然后通過調用Location中(zhong)的(de)(de)getLatitude()和getLongitude()方(fang)法可以分別獲取位置信息中(zhong)的(de)(de)緯(wei)度和經(jing)度,示例代碼如代碼清單所示。
代(dai)碼清單獲取經緯(wei)度信(xin)息
doublelat = location.getLatitude();
doublelng = location.getLongitude();
實(shi)現(xian)LocationListener類。代碼如代碼清單所示。
代碼清單LocationListener
LocationListenerlocationListener = new LocationListener(){
//在設備的位置改變時被調用
public void onLocationChanged(Location location) {
}
//在用戶禁用具有定位功能的硬件時被調用
public void onProviderDisabled(String provider) {
}
//在用戶啟用具有定位功能的硬件時被調用
public void onProviderEnabled(String provider) {
}
//在提供定位功能的硬件的狀態改變時被調用,如從不可獲取位置信息狀態到可以獲取位置信息的狀態,反之亦然
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
利用(yong)requestLocationUpdates()方法啟動位(wei)置信息的接(jie)收。
LocationManager提供(gong)了一種便捷(jie)、高效的(de)位(wei)置監(jian)視(shi)方法requestLocationUpdates(),可以根據位(wei)置的(de)距離變(bian)化(hua)和時間(jian)間(jian)隔設定產生位(wei)置改(gai)變(bian)事(shi)件的(de)條(tiao)件,這樣可以避免因微(wei)小的(de)距離變(bian)化(hua)而產生大量(liang)的(de)位(wei)置改(gai)變(bian)事(shi)件。
LocationManager中設定監聽位置(zhi)變化(hua)的(de)代(dai)碼如(ru)代(dai)碼清單所示。
代碼清單監聽(ting)位置變化
locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);
其中(zhong),第1個(ge)參數(shu)是定位(wei)(wei)的(de)(de)(de)方法,GPS定位(wei)(wei)或(huo)網絡(luo)定位(wei)(wei);第2個(ge)參數(shu)是產(chan)生位(wei)(wei)置(zhi)改(gai)(gai)變(bian)事(shi)(shi)件(jian)(jian)(jian)(jian)的(de)(de)(de)時(shi)間(jian)間(jian)隔,單位(wei)(wei)為(wei)微秒;第3個(ge)參數(shu)是距(ju)離(li)條(tiao)件(jian)(jian)(jian)(jian),單位(wei)(wei)是米;第4個(ge)參數(shu)是回調函數(shu),在滿足條(tiao)件(jian)(jian)(jian)(jian)后的(de)(de)(de)位(wei)(wei)置(zhi)改(gai)(gai)變(bian)事(shi)(shi)件(jian)(jian)(jian)(jian)的(de)(de)(de)處理函數(shu)。代碼將產(chan)生位(wei)(wei)置(zhi)改(gai)(gai)變(bian)事(shi)(shi)件(jian)(jian)(jian)(jian)的(de)(de)(de)條(tiao)件(jian)(jian)(jian)(jian)設定為(wei)距(ju)離(li)改(gai)(gai)變(bian)10米,時(shi)間(jian)間(jian)隔為(wei)2秒。
為了(le)使GPS定(ding)位功(gong)能生(sheng)效(xiao),還需要在AndroidManifest.xml文件中加入用(yong)戶(hu)許可(ke)。沒有這些權限,應用(yong)程(cheng)序在運行時是無法(fa)獲取到位置更(geng)新的。實現代(dai)碼如下所示:
代碼(ma)清單 AndroidManifest.xml
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
此處需注意,若使用GPS_PROVIDER,則使用ACCESS_FINE_LOCATION權限;若使用NETWORK_PROVIDER,則使用ACCESS_FINE_LOCATION和ACCESS_COARSE_
LOCATION權(quan)限。
位(wei)置服務一般都需要使用(yong)設備(bei)上(shang)(shang)的(de)硬(ying)件,理想的(de)調試(shi)方(fang)式是將程序(xu)上(shang)(shang)傳(chuan)到物理設備(bei)上(shang)(shang)運行,但在沒有物理設備(bei)的(de)情況下,也可以使用(yong)Android模擬(ni)(ni)器提(ti)供的(de)虛(xu)擬(ni)(ni)方(fang)式模擬(ni)(ni)設備(bei)的(de)位(wei)置變(bian)化,調試(shi)具有位(wei)置服務的(de)應用(yong)程序(xu)。
首先打開(kai)DDMS中的(de)(de)(de)模(mo)擬器(qi)控制,在Location Controls中的(de)(de)(de)Longitude和Latitude部分輸入設(she)備當前的(de)(de)(de)經度和緯度,然后(hou)單擊(ji)“Send”按鈕(niu),就將虛擬的(de)(de)(de)位置信息(xi)發送(song)到Android模(mo)擬器(qi)中,如圖所示。
在程(cheng)序運行過程(cheng)中(zhong),可以在模擬器(qi)控制器(qi)中(zhong)改變經度(du)和緯度(du)坐標值,程(cheng)序在檢測(ce)到位(wei)置的(de)變化后(hou),會將(jiang)新的(de)位(wei)置信息顯示在界(jie)面上。
CurrentLocationDemo是一個提供位置(zhi)服務的基本(ben)示例,提供了顯(xian)示當前位置(zhi)新的功能(neng),并能(neng)夠監視設備的位置(zhi)變化(hua)。
CurrentLocationDemo示(shi)例中LocationBasedServiceDemo.java文件的(de)完整代(dai)碼如代(dai)碼清(qing)單所示(shi)。
代碼清單 LocationBasedServiceDemo.java
packagecn.com.farsight.LocationBasedServiceDemo;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.widget.TextView;
importandroid.location.Location;
importandroid.location.LocationListener;
importandroid.location.LocationManager;
public class LocationBasedServiceDemo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String serviceString = Context.LOCATION_SERVICE;
LocationManagerlocationManager =
(LocationManager)getSystemService(serviceString);
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
getLocationInfo(location);
locationManager.requestLocationUpdates(provider, 2000, 0, locationListener);
}
private void getLocationInfo(Location location){
String latLongInfo;
TextViewlocationText = (TextView)findViewById(R.id.txtshow);
if (location != null){
doublelat = location.getLatitude();
doublelng = location.getLongitude();
latLongInfo = "Lat: " + lat + "\nLong: " + lng;
}
else{
latLongInfo = "No location found";
}
locationText.setText(“Your Current Position is:\n" + latLongInfo);
}
private final LocationListenerlocationListener = new LocationListener(){
@Override
public void onLocationChanged(Location location) {
getLocationInfo(location);
}
@Override
public void onProviderDisabled(String provider) {
getLocationInfo(null);
}
@Override
public void onProviderEnabled(String provider) {
getLocationInfo(null);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
}

