天天看點

對Android GPS擷取位置資訊的新研究

 最近在做一個 android 項目,需要用到gps擷取位置資訊,從 api 查了一下,發現擷取位置資訊僅需極其簡單的一句即可:

  getlastknownlocation(locationmanager.gps_provider),

于是高興地不得了。可是一寫進代碼裡,傳回值(location 類型)居然一直為null..郁悶的不得了。在網上查了好久,發現好多人都和我一樣糾結于這個問題上,有人說是因為gps沒打開,也有人說是相關權限沒加上..可是我的明明已經在設定裡打開,權限自然也加上了。在api上糾結了半天,終于找出原因了,原來要打開gps其實在于這句:

  settestproviderenabled("gps",true);

而跟手機上的設定沒多大關系(起碼在我的手機上測是這樣的)。手機上的設定關閉了,這一句照樣能打開;而即使手機設定打開了,沒這一句也是白搭。與這句對應的是

  settestproviderenabled("gps",false);

用來關閉gps.

  gps打開後可以用上面的方法擷取location了嗎?還是不可以!确切地說是有時候可以,因為這個函數擷取的是上次已經獲得的位置資訊,設想如果此程式第一次跑,先前并沒有擷取過位置資訊,當然傳回值為null了。經仔細檢視api,在 

  requestlocationupdates (string provider, long mintime, float mindistance, locationlistener listener)

裡發現了這樣一句話:it may take a while to receive the most recent location. if an immediate location is required, applications may use the getlastknownlocation(string) method. 是以為了擷取位置資訊,應該用此方法為manager設定監聽器,在監聽器中onlocationchanged(location location)裡擷取。

  測試代碼如下:

  public void onlocationchanged(location location)

            {

                log.i("onlocationchanged", "come in");

                if (location != null)

                {

                    log.w("location","current altitude = "+ location.getaltitude());

                    log.w("location","current latitude = "+ location.getlatitude());

                }

            }

  經過測試,經過一段時間後可以擷取location(擷取時間與mintime、mindistance相關)。還需注意的一個問題是在設定了監聽器後,删除監聽器之前不能用上面的方法關閉gps,否則會報錯。是以關閉gps的方法是

  manager.removeupdates (listener);//listener 即為監聽器執行個體

  manager.settestproviderenabled("gps",false);

  以下是測試代碼,所需權限有:

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

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

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

現在再回過頭來看看上面的描述,确實有不少不足甚至錯誤.這篇算做補充和糾正吧.

  1.要想擷取位置資訊,需要在手機設定中将"位置與安全"設為使能.前篇文章說不用設定,完全是錯誤的.

  2.locationmanager提供了兩個provider(至少目前看來是兩個):gps_provider  &

network_provider.可以在"位置與安全"裡設定用哪個provider來擷取位置資訊(使用gps衛星 or  使用無線網絡 ).

  3.在開發中可以用 isproviderenabled(string provider) 來判斷哪一個provider是使能的.

  4.有人說用 getbestprovider(criteria,boolean)來擷取最佳provider來使用,其實這個函數以精确度為首要判定标準,是以一般傳回都是gps(經測試,似乎隻有gps不使能,才傳回network).

  5.完全可以兩個provider一起使用,并且用一個listener.

  測試手機:u8220 & xt800

繼續閱讀