Android學習筆記(五六):位置Location
建議更新20130522的ADT版本,無論是Linux下還是Windows下,我覺得速度快了很多。而且將Android SDK Tool升級到ver 22版本後,原來的ADT有很多不明原因問題,載入App到模擬器上出現連線不上的情況。
允許應用具備定位功能
Location是手機功能的一大特色,衛星導航除了GPS外,還有歐洲的伽利略和我國的北斗,此外還有運營商移動基站的三角定位、第三方提供WiFi熱點定位等方式。相關推薦可以閱讀CDMA的定位方式。利用基站訊號的強弱進行三角特定的方式(在市區內受到建築阻擋和反射等影響),利用上網的AP所出的地理位置來進行定位,都屬於粗定位coarse location,利用衛星的精確定位為fine location。應用要具備定位功能,首先必須進行許可權許可。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在模擬器中設定位置
我們可以通過DDMS在模擬器中設定經緯度,並在程式執行是修改經緯度。Window -> Open perspective -> DDMS
連續位置獲取小例子
下面的例子很簡單,UI是一個TextView用來顯示資訊。我們進行裝置位置的不斷跟蹤,也就是跟蹤我們的路徑。
public class LocationBase extends Activity{
private TextView myText;
private String textStr = "";
private LocationManager mgr=null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pure_text_view);
myText = (TextView) findViewById(R.id.pure_text);
addText("Location Based-Services Demo...");
//步驟 1: 獲取系統的定位管理器
mgr = (LocationManager)getSystemService(LOCATION_SERVICE);
addText("get system Location Manager " + mgr);}
//步驟2.2 持續跟蹤中的停止update:在本例中,我們要求不斷獲得位置更新,我們必須在人工進行removeUpdates(),否則即使應用中所有的Activity都關閉,App仍繼續在不斷更新位置資訊,導致應用資源無法被回收
protected void onPause() {
super.onPause();
mgr.removeUpdates(onLocationChange);
addText("Remove Updates...");
}
//步驟2:設定持續跟蹤
//步驟 2.1(1) :我們在onResume()中持續跟蹤,相應的在onPause()中關閉出現跟蹤。我們只在Activity執行時進行跟蹤。具體見Activity的生命週期
protected void onResume() {
super.onResume();
//步驟2.1 (2):由於人的位置是不斷變化,我要設定一個位置變化的範圍,包括同時滿足最小的時間間隔和最小的位移變化,如果兩個條件要同時滿足,將位置監聽器將被觸發。實際上該方法有多個引數格式,特別是requestLocationUpdates (long minTime, float minDistance, Criteria criteria,PendingIntent intent),當位置變化時可呼叫其他的Activity。 在本例中,我們制定用GPS,則在許可權中必須要求精確定位許可。
mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000/*10秒,為測試方便*/, 1000/*1公里*/, onLocationChange/*位置監聽器*/);
addText("Request Updates automatically ...");
}
//步驟3:位置監聽器LocationListener 的設定,當位置發生變化是觸發onLocationChanged( )
LocationListener onLocationChange = new LocationListener(){
public void onLocationChanged(Location location) {
addText("Location Changed : (" + location.getLongitude()+","+location.getLatitude()+")");
}
public void onProviderDisabled(String arg0) {
addText("onProviderDisabled");
}
public void onProviderEnabled(String arg0) {
addText("onProviderEnabled");
}
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
addText("onStatusChanged");
}
};
private void addText(String s){
textStr = textStr.concat(s + "\n\n");
myText.setText(textStr);
}
}
我們可能會發現一開始並沒有出發到位置監控器的onLocationChanged(),在實際中,可能由於GPS沒有開啟,或者剛開啟,不能馬上得到位置資訊。在模擬器中,我們在DDMS中將按“send”按鈕即可。更改位置資訊,同樣需按“send”。
關於定位的選定
在例子中,我們指定了採用GPS,實際上位置獲取可以通過衛星,運營商,以及第三方服務獲取,即有多個資訊來源。我們可以想系統查詢可用的位置資訊源,如下:
List<String> list = mgr.getAllProviders(); //mgr即LocationManager
for(Iterator<String> i = list.iterator();i.hasNext();){
System.out.println("\t" + i.next());
}
我們可以重中進行選擇,或者讓使用者選擇,但是更好的方式是讓系統幫忙選擇。如下:
Criteria criteria = new Criteria();
String providerName = mgr.getBestProvider(criteria, true
/*enabledOnly*/); //criteria不能填null,否則出現異常
LocationProvider provider = mgr.getProvider(providerName);
我們可以在criteria中加入一些條件,例如一些精度setAccuracy(),和一些位置資訊setAltitudeRequired( ),是否收費setCostAllowed( )等。不是隨有的條件都必須滿足,將為你匹配最好的一個,當然如果你設定了免費,不會選擇收費給你的。我們根據provider的名字獲得LocationProvider的物件,但一般不需要,我們知道provider的名字,就可以向系統請求位置資訊。
Location location = mgr.getLastKnownLocation(providerName);
if(location != null)
System.out.println("Get Location from " + providerName + " : " + location.getLatitude()+ "," + location.getLongitude());
Android採用getLastKnownLocation( )來查詢,而不是當前的實時資訊。有可能由於某種情況無法獲取,例如GPS沒有開啟,或正在啟動過程中,有可能返回null。返回的資訊可能不僅有經緯度,是否有具有海拔資訊,用location.hasAltitude()詢問,是否具有速度資訊,用hasSpeed()詢問。
到達某個位置的提醒觸發
當用戶位置到達某個目標附近 ,觸發提醒,這可以用在很多使用場景,LocationManager中可以通過addProximityAlert(),當在某位置附近可以調起pendingIntent。
public void addProximityAlert (double latitude /*維度*/,
double longitude/*精度*/,
float radius/*半徑範圍*/,
long expiration/*失效,-1表示沒有失效,可以用removeProximityAlert()來進行人工刪除*/,
PendingIntent intent /*觸發處理*/)
對比兩個location資料
對於前後獲取的location(可能來自不同的provider,也可能獲取位置資訊的條件發生變化,例如尋找多一顆衛星或少了一顆衛星,導致前後的精度有明顯差異),我們可以判斷哪個location更好地代表當前的地點。我們可以用location.getTime()來獲得定位資訊的更新時間,用location.getAccruacy()來獲取精度,用location.getProvider()反過來獲取providerName,用於進行提供者的比對。通過這些比較我們可以選取我們仍未最好的資料。在Android的開發者網站中給出 了選擇哪個location的例子。
相關推薦
Android學習筆記(五六):位置Location
建議更新20130522的ADT版本,無論是Linux下還是Windows下,我覺得速度快了很多。而且將Android SDK Tool升級到ver 22版本後,原來的ADT有很多不明原因問題,載入App到模擬器上出現連線不上的情況。 允許應用具備定位功能 Location是手機功能的一大特色,衛星導航除了
Pro Android學習筆記(五十):ActionBar(3):搜尋條
ActionBar中的搜尋條 我們同樣可以在Action Bar中嵌入搜尋條。在小例子中,我們在action bar中嵌入一個搜尋框的widget(稱為search view)。當我們輸入搜尋內容,能夠在指定的activity中開啟(稱為searchable activitiy),本例不做實質的搜尋,只是
Android學習筆記(五六:位置Location
建議更新20130522的ADT版本,無論是Linux下還是Windows下,我覺得速度快了很多。而且將Android SDK Tool升級到ver 22版本後,原來的ADT有很多不明原因問題,載入App到模擬器上出現連線不上的情況。允許應用具備定位功能Location是手機功能的一大特色,衛星導航除了GPS
Pro Android學習筆記(一三七):Home Screen Widgets(3):配置Activity
map onclick widgets info xtra ces extends height appwidget 文章轉載僅僅能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處http://blog.csdn.net/flowingfly
Java學習筆記(十六):static關鍵字
ima 關鍵字 static關鍵字 es2017 java學習筆記 sta com 筆記 nbsp Java學習筆記(十六):static關鍵字
R語言學習筆記(十六):處理缺失值
ima 結果 cti img dataset case prop .com log #識別缺失值 install.packages("VIM") data(sleep,package="VIM") #列出沒有缺失值的行 sleep[complete.case
javaweb學習筆記(十六):JDBC(2)
批處理 當需要向資料庫傳送一批SQL語句執行時,應避免向資料庫一條條的傳送執行,而應採用JDBC的批處理機制,以提升執行效率。 實現批處理有兩種方式: ①Statement.addBatch(sql) :新增批處理命令。 優點:可以向資料庫傳送多條不同的SQL語句。 缺點:S
Android學習筆記(二六) 輸入法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
機器學習筆記(十六):TensorFlow實戰八(經典卷積神經網路:GoogLeNet)
1 - 引言 GoogLeNet, 在2014年ILSVRC挑戰賽獲得冠軍,將Top5 的錯誤率降低到6.67%. 一個22層的深度網路 論文地址:http://arxiv.org/pdf/1409.4842v1.pdf 題目為:Going deeper with convolu
機器學習筆記(十六):大規模機器學習
目錄 1)Learning with large datasets 2)Stochastic gradient descent 3)Mini-batch gradient descent 4)Stochastic gradient descent convergence 1)
Android學習筆記(四十):Preference的使用
Preference直譯為偏好,博友建議翻譯為首選項。一些配置資料,一些我們上次點選選擇的內容,我們希望在下次應用調起的時候依然有效,無須使用者再一次進行配置或選擇。Android提供preference這個鍵值對的方式來處理這種情況,自動儲存這些資料,並立時生效,同時Andr
Pro Android學習筆記(四二):Fragment(7):切換效果
利用fragment transaction進行切換,很方便提供切換的效果。 利用setTransition() 通過setTransition()我們可以設定有限幾個切換效果,程式碼如下: protected void addFragmentToStack(int index){
Java for Web學習筆記(五十):Log(2)配置log4j2
相關maven <!-- log4j-api提供logging的API。這是log4j2中唯一需要在compile時加入,含有你所需的所有類 --> <dependency> <groupId>org.apache.loggin
Python學習筆記(十六):類程式碼編寫細節
以Mark Lutz著的《Python學習手冊》為教程,每天花1個小時左右時間學習,爭取兩週完成。 --- 寫在前面的話 2013-7-25 15:30 學習筆記 1,把簡單的非函式物件賦值給類屬性,就會產生資料屬性,由所有例項共享。但對例項的屬性進行賦值運算只會在該例項
C#學習筆記(十六):索引器和重載運算符
instance cit png form mage 創建 return position args 二維數組如何映射到一維數組 重載運算符 1、算術運算符 2、關系運算符, < 和 > 成對重載 using System; using Sy
Android學習筆記(四七):Content Provider初談和Android聯絡人資訊
Content Provider 在資料處理中,Android通常使用Content Provider的方式。Content Provider使用Uri例項作為控制代碼的資料封裝的,很方便地訪問地進行資料的增、刪、改、查的操作。Android並不提供所有應用共享的資料儲存,採用content Provide
Pro Android學習筆記(一五四):感測器(4):陀螺儀、加速感測器
陀螺儀 陀螺儀(Gyroscope sensor)測量裝置轉動的角速度。最早的陀螺儀發明在中國,科學應用則在西方,陀螺儀是為士大夫坐轎子看書是免收燭光搖曳發明的,這在很久之前一部西方拍的科教片看到,具體名字忘了。Pro Android 4.0中說陀螺儀的誤差會慢慢積累,因此通與加速感測器一致使用,通過Ka
pytorch學習筆記(十六):pytorch 寫程式碼時應該注意
當網路中有 dropout,bn 的時候。訓練的要記得 net.train(), 測試 要記得 net.eval() 在測試的時候 建立輸入 Variable 的時候 要記得 volatile=Tru
Pro Android學習筆記(一六二):聯絡人API(5):讀Raw Contacts
我們將讀取Raw Contacts的資訊。 Raw Contacts提供的資訊 程式碼和之前獲取整合聯絡人的表頭資訊類似,只是URI不同,Raw contacts的URI為ContactsContract.RawContacts.CONTENT_URI。 private void showHasWhat
Pro Android學習筆記(一六十):聯絡人API(3):聯絡人資料
聯絡人資訊 檢視reference中android.provider.ContactsContract.CommonDataKinds可以知道該版本的Android API聯絡人中帶有哪些資訊。在API level 19中,我們看到有以下的資訊: 而各個資訊,例如Email,又有著他的結構,我們可以繼續