1. 程式人生 > >Android學習筆記(五六):位置Location

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學習筆記ActionBar3搜尋條

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 Widgets3配置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學習筆記JDBC2

批處理 當需要向資料庫傳送一批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學習筆記四二Fragment7切換效果

利用fragment transaction進行切換,很方便提供切換的效果。 利用setTransition() 通過setTransition()我們可以設定有限幾個切換效果,程式碼如下:     protected void addFragmentToStack(int index){       

Java for Web學習筆記Log2配置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學習筆記聯絡人API5讀Raw Contacts

我們將讀取Raw Contacts的資訊。 Raw Contacts提供的資訊 程式碼和之前獲取整合聯絡人的表頭資訊類似,只是URI不同,Raw contacts的URI為ContactsContract.RawContacts.CONTENT_URI。 private void showHasWhat

Pro Android學習筆記聯絡人API3聯絡人資料

聯絡人資訊 檢視reference中android.provider.ContactsContract.CommonDataKinds可以知道該版本的Android API聯絡人中帶有哪些資訊。在API level 19中,我們看到有以下的資訊: 而各個資訊,例如Email,又有著他的結構,我們可以繼續