最近在做一個 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