溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Android GPS定位的簡(jiǎn)單應(yīng)用

發(fā)布時(shí)間:2020-06-29 18:32:35 來(lái)源:網(wǎng)絡(luò) 閱讀:907 作者:xhmengmse 欄目:移動(dòng)開(kāi)發(fā)

轉(zhuǎn)自我的新浪博文 

      

       在Android的位置服務(wù)中,有兩個(gè)重要的類(lèi)LocationManager和LocationProvider,提供了一系列方法來(lái)處理與位置相關(guān)的問(wèn)題,包括查詢(xún)一個(gè)已知位置;注冊(cè)(注銷(xiāo))來(lái)自某個(gè)LocationProvider的周期性的位置更新;以及注冊(cè)(注銷(xiāo))接近某個(gè)坐標(biāo)時(shí)對(duì)一個(gè)已定義Intent的觸發(fā)等。 

    Android的地理定位系統(tǒng)的API位于android.location包內(nèi),其中包含了以下幾個(gè)重要的功能類(lèi):

1、LocationManager:

    本類(lèi)提供訪(fǎng)問(wèn)定位服務(wù)的功能,另外也提供獲取最佳定位提供者的功能。

2、LocationProvider:

    該類(lèi)是定位提供者的抽象類(lèi)。定位提供者具備周期性報(bào)告設(shè)備地理位置的功能。

3、Criteria:

    可譯為標(biāo)準(zhǔn)、規(guī)則,用于在可以獲得的LocationProvider列表中獲取合適的定位提供者。不同的定位提供者具有不同的精確度、靈敏度等指標(biāo),通過(guò)定義Criteria并設(shè)置其屬性,可以選擇合適的定位提供者。

4、LocationListener:

    提供定位信息發(fā)生改變時(shí)的回調(diào)功能。必須事先在定位管理器中注冊(cè)監(jiān)聽(tīng)器對(duì)象。

5、Geocoder:

    用于處理地理編碼和反向地理編碼的類(lèi)。地理編碼是指將地址或其他描述轉(zhuǎn)變?yōu)榻?jīng)度和緯度,反向地理編碼則是將經(jīng)度和緯度轉(zhuǎn)變?yōu)榈刂坊蛎枋稣Z(yǔ)言,其中包含了兩個(gè)構(gòu)造函數(shù),需要傳入經(jīng)度和緯度的坐標(biāo)。

    要使用地理定位,首先需要取得LocationManager的實(shí)例,在Android中,獲得LocationManager的唯一方法是通過(guò)getSystemService方法的調(diào)用。

    String serviceName = Context.LOCATION_SERVICE;  
    LocationManager    locationManager = (LocationManager) getSystemService(serviceName);

    通過(guò)使用LocationManager,我們可以獲得一個(gè)位置提供者的列表。在一個(gè)真實(shí)的手持設(shè)備中,這個(gè)列表包含了一些GPS服務(wù)(或基于網(wǎng)絡(luò)的位置信息服務(wù)等)。我們可以通過(guò)設(shè)置一些標(biāo)準(zhǔn)來(lái)選擇合適的位置提供者:

    Criteria criteria = new Criteria();  
    criteria.setAccuracy(Criteria.ACCURACY_FINE);【高精確度】  
    criteria.setAltitudeRequired(false); 【設(shè)置是否需要高度信息】 
    criteria.setBearingRequired(false);【設(shè)置是否需要方位信息】 
    criteria.setCostAllowed(true);【設(shè)置是否允許產(chǎn)生費(fèi)用】  
    criteria.setPowerRequirement(Criteria.POWER_LOW);【設(shè)置耗電的高低】  
    String provider = locationManager.getBestProvider(criteria, true);

    當(dāng)然,我們也可以直接選擇更強(qiáng)大、更精確、不帶其他附加服務(wù)的GPS:

    String provider = LocationManager.GPS_PROVIDER;

    得到了LocationManager的實(shí)例以后,我們通過(guò)下面的語(yǔ)句來(lái)注冊(cè)一個(gè)周期性的位置更新:

    private static final int step = 2000; 【2s】

    ......

    locationManager.requestLocationUpdates(provider, step, 0,  locationListener);

    其中第一個(gè)參數(shù)是設(shè)置服務(wù)提供者,第二個(gè)參數(shù)是周期,第三個(gè)參數(shù)是以米為單位的最小位置變化,最后一個(gè)參數(shù)locationListener,是用來(lái)監(jiān)聽(tīng)定位信息的改變。

    這句代碼告訴系統(tǒng),我們需要從位置提供者(如GPS)獲取位置信息,并且是每隔2000ms更新一次,不考慮最小位置變化。


    locationListener必須要實(shí)現(xiàn)如下方法:

1、onLocationChanged(Location location)

    當(dāng)坐標(biāo)改變時(shí)候觸發(fā)該函數(shù),如果Provider傳相同的坐標(biāo),它就不會(huì)觸發(fā)。

2、onProviderDisabled(String provider)

    Provider禁用時(shí)觸發(fā)此函數(shù),比如GPS被關(guān)閉。

3、onProviderEnabled(String provider)

    Provider啟用時(shí)觸發(fā)此函數(shù),比如GPS被打開(kāi)。

4、onStatusChanged(String provider, int status, Bundle extras)

    Provider的狀態(tài)在可用、暫時(shí)不可用和無(wú)服務(wù)三個(gè)狀態(tài)直接切換時(shí)觸發(fā)此函數(shù)。

    要使用定位的API,還需要在AndroidManifest.xml文件中添加其權(quán)限:    
    Android GPS定位的簡(jiǎn)單應(yīng)用

    如果在模擬器上測(cè)試,需要人為的設(shè)置一個(gè)坐標(biāo)。有兩種方法來(lái)設(shè)置一個(gè)模擬的坐標(biāo)值。第一種方法是通過(guò)DDMS,我們可用在Eclipse的ADT插件中使用這種方法,只要啟動(dòng)Eclipse,選擇“Window”->“Show View”,打開(kāi)“Emulator Control”界面,手動(dòng)或者通過(guò)KML和GPX文件來(lái)設(shè)置一個(gè)坐標(biāo):

Android GPS定位的簡(jiǎn)單應(yīng)用
    另外一種方法使用geo命令。我們需要telnet到本機(jī)的5554端口,然后在命令行輸入類(lèi)似以下命令:

    geo fix -121.45365 46.51119 4392

    后面三個(gè)參數(shù)分別是經(jīng)度、緯度和(可選)海拔。設(shè)置后再Android模擬器屏幕上便多出了一個(gè)如下圖所示的標(biāo)志,表示模擬了GPS權(quán)限:

Android GPS定位的簡(jiǎn)單應(yīng)用

Android GPS定位的簡(jiǎn)單應(yīng)用

    使用telnet命令的示意圖如下:

Android GPS定位的簡(jiǎn)單應(yīng)用

Android GPS定位的簡(jiǎn)單應(yīng)用


示例代碼下載

參考文章:

    《Android應(yīng)用開(kāi)發(fā)揭秘》

     android 模擬器上GPS的使用

     android GPS定位系統(tǒng)

     Android:GPS衛(wèi)星定位

     初探Android平臺(tái)上的定位服務(wù)(GPS)

 

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI